Spring5.x 学习笔记(二)IOC 容器

IOC 容器

前言
本文笔记是基于尚硅谷视频写的,内容很丰富,比较全面,在其基础上又添加了一些个人资料的搜集,综合学习。
https://www.bilibili.com/video/BV1Vf4y127N5?from=search&seid=7188443139506413184

1、IOC底层原理

1.1、IOC概念

  • 什么是IOC?

    (1) 控制反转,把对象创建和对象之间的调用过程,交给Spring管理
    (2) 使用IOC的目的:为了降低耦合度

1.2、IOC底层原理

  • IOC底层原理
    (1) xml的解析、工厂的设计模式、反射
  • 工厂模式(Factory Pattern)是 Java中最常用的设计模式之一。这种类型的设计模式属于创建型模 式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
  • xml解析参考网址:https://www.cnblogs.com/longqingyang/p/5577937.html

Spring5.x 学习笔记(二)IOC 容器
Spring5.x 学习笔记(二)IOC 容器
Spring5.x 学习笔记(二)IOC 容器

2、IOC接口

  • IOC的思想基于IOC的容器完成,IOC容器底层就是对象工厂
  • Spring提供了IOC容器实现的两种方式:(两个接口)
    (1)BeanFactory:IOC容器基本实现,是Spring内部使用的接口,不建议开发人员进行使用
    *加载配置文件的时候不会创建对象,在获取对象(使用)才去创建对象
    (2)ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开发人员进行使用
    *加载配置文件的时候就会把配置文件对象进行创建
    (3)ApplicationContext接口的实现类,比较重要,需要记一下。
    *FileSystemXmlApplicationContext
    *ClassPathXmlApplicationContext

3、IOC操作Bean管理(基于xml)

3.1、Bean管理概念

  • 什么是Bean管理?
    Bean管理指的是两个操作
    (1)创建对象
    (2) 注入属性
  • Bean管理的操作方式?
    (1)基于xml配置文件方式
    (2)基于注解方式

3.2、IOC操作Bean管理

3.2.1 基于xml方式创建对象

(1)在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建

<bean id="User" class="com.xx.xx.User"></bean>

(2)在bean标签中有很多属性,这里介绍常用的属性

  • id:对象的唯一标识
  • class:类的全路径(包类路径)
  • name:一般不用,对象的name

(3)创建对象的时候,默认是使用无参构造的方法完成对象的创建

3.2.2 基于xml方式注入属性

(1)DI:依赖注入,就是注入属性,需在创建对象完成的基础上

  • 方式一:set方法注入(1、创建一个类 2、设置属性的set方法)
  • 方式二:有参构造注入(1、创建一个类、有参的构造方法 2、基于有参构造创建对象的实例对象)

3.2.3 基于xml方式配置

<!--基于xml使用set方法注入将对象注入Spring容器-->
<bean id="User" class="com.xx.xx.User">
	<!--通过property完成属性注入-->
	<property name="属性名称" value="属性值"></property>
</bean>  
<!--基于xml使用有参构造注入的方式将对象注入Spring容器-->
<bean id="User" class="com.xx.xx.User">
	<!--通过constructor-arg完成属性注入-->
	<constructor-arg name="构造参数名称" value="构造参数值" index="参数的索引值—(不建议使用)"></constructor-arg>
	<constructor-arg name="构造参数名称" value="构造参数值"></constructor-arg>
</bean>  

3.2.4 p名称空间注入(了解)

<!--基于xml使用p名称空间注入方法将对象注入Spring容器-->

<!--1、在配置文件的头部添加约束配置-->
<beans xmlns:p="http://www.springframework.org/schema/p">


<!--2、使用p进行属性注入,在bean标签里面进行操作-->
<bean id="User" class="com.xx.xx.User" p:属性名称="属性值">
</bean>  

3.2.5 基于xml方式设置属性值为null、包含特殊符号

<!--基于xml方式设置属性值为null-->
<bean id="User" class="com.xx.xx.User">
	<!--通过property完成属性注入-->
	<property name="属性名称">
		<null/>
	</property>
</bean>  
<!--基于xml方式设置属性值包含特殊符号-->
<bean id="User" class="com.xx.xx.User">
	<!--
		1、转义
		2、将特殊符号放在CDATA中 &gt; &lt;
	-->
	<property name="属性名称" value="<<属性值>>">
		<value><![CDATA[属性值]]></value>
	</property>
</bean>  

3.2.6 基于xml注入属性-外部bean和级联赋值

先理解一下外部bean,创建service和dao两个类,在Service类中调用Dao类的方法

<bean id="service" class="com.xx.xx.Service">
	<!--
		1、name指的是属性名称
		2、ref指的是id为dao的bean对象
	-->
	<property name="dao" ref="dao"></property>
</bean>
<bean id="dao" class="com.xx.xx.Dao"></bean>

3.2.7 基于xml注入数组类型属性

<!--数组类型属性注入-->
<bean id="xx" class="com.xx.xx.Xx">
	<property name="xx">
		<array>
			<value>属性值</value>
			<value>属性值</value>
			<value>属性值</value>
		</array>	
	</property>
</bean>

3.2.8 基于xml注入List集合类型属性

<!--List集合类型属性注入-->
<bean id="xx" class="com.xx.xx.Xx">
	<property name="xx">
		<list>
			<value>属性值</value>
			<value>属性值</value>
			<value>属性值</value>
		</list>	
	</property>
</bean>

3.2.9 基于xml注入Map集合类型属性

<bean id="xx" class="com.xx.xx.Xx">
	<property name="xx">
		<entry>
			<entry key="" value=""></entry>
			<entry key="" value=""></entry>
		</entry>	
	</property>
</bean>

3.2.10 基于xml注入Set集合类型属性

<!--Set集合类型属性注入-->
<bean id="xx" class="com.xx.xx.Xx">
	<property name="xx">
		<set>
			<value>属性值</value>
			<value>属性值</value>
		</set>	
	</property>
</bean>

3.2.10 基于xml设置集合的属性值为对象

<bean id="user" class="com.xx.xx.User"></bean>

<!--list集合作为例子-->
<bean id="xx" class="com.xx.xx.Xx">
	<property name="xx">
		<list>
			<!--<value>属性值</value>-->
			<!--bean为对象的ID-->
			<ref bean="user"></ref>
		</list>	
	</property>
</bean>

3.2.11 xml模式中Spring的两种bean

  • Spring中有两种bean:
    (1)普通bean:在配置文件中定义bean类型就是返回类型;
    (2)工厂bean:在配置文件中定义bean类型可以和返回类型不一样;
  • 实现工厂bean的步骤:
    (1)基于xml配置文件将类对象注入IOC容器;
    (2)使类对象实现FactoryBean接口,并实现接口的抽象方法;
    (3)重构getObject方法,返回Object对象;

3.2.12 基于xml模式理解bean的作用域

在Spring中可以设置单实例对象或者多实例对象,默认为单实例对象。

<!--通过scope属性设置单/多实例对象-->
<!--
	1、单实例:singleton
		特点:加载Spring配置文件时,就会创建bean对象;
	2、多实例:prototype
		特点:在执行getXx()时,创建bean对象;
	3、请求:request
		特点:创建对象时,将对象放入request中;
	4、请求:session
		特点:创建对象时,将对象放入session中;
-->
<bean id="user" class="com.xx.xx.User" scope="singleton"></bean>

3.2.13 基于xml模式理解bean的生命周期

(bean)生命周期:对象的创建–>对象的销毁

生命周期实现步骤

  1. 通过构造器创建bean的实例(无参构造)
  2. 为bean的属性设置值和对其他bean的引用(调用set方法)
  3. 将bean的实例传递给bean的后置处理器的方法
  4. 调用bean的初始化方法(需要进行配置)
  5. 将bean的实例传递给bean的后置处理器的方法
  6. bean对象可以使用了
  7. 当容器关闭的时候,调用bean的销毁方法(需要进行配置,并手动调用)
<!--初始化方法和销毁方法在User类中定义-->
<!--(ClassPathXmlApplicationContext)xx.close()-->
<bean id="user" class="com.xx.xx.User" init-method="初始化方法" destroy-method="销毁方法"></bean>

创建后置处理器步骤

  1. 创建类实现BeanPostProcessor接口
  2. 实现接口的抽象方法

3.2.14 基于xml配置实现自动装配属性

自动装配:
(1)根据属性名称或者属性值,Spring自动将匹配属性进行注入

<!--
	属性类型 属性名称;(理解)
	1、autowire="byName"	根据属性的名称进行注入;注入bean的id值和类属性名称保持一致;
	2、autowire="byType"	根据属性的类型进行注入;注入bean的类型和类属性类型保持一致;
-->
<bean id="user" class="com.xx.xx.User" autowire="byName"></bean>

3.2.15 基于xml配置外部属性配置文件(properties配置文件)

连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

例:数据库配置文件实现步骤

  1. 引入druid连接池的jar包
  2. 在xml配置文件中创建druid连接池对象,并注入属性
  3. 创建外部属性配置文件(jdbc.properties),配置文件中记录了连接池的信息
  4. 引入context配置文件,通过配置xml头信息,context配置
  5. 引入外部属性配置文件
<!--引入外部属性配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!--使用外部属性配置文件-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
	<property name="xx" value="${xx.xx}"></property>
</bean>

4、IOC操作Bean管理(基于注解)

4.1、什么是注解

参考网址:https://www.runoob.com/w3cnote/java-annotation.html

4.2、Spring针对Bean管理中创建对象提供的注解介绍

(1)@Component(Spring的基础配置文件)
(2)@Service
(3)@Controller
(4)@Repository(持久层)

特点:以上的注解都可以用来创建bean实例

基于注解方式实现对象创建步骤

  1. 引入jar依赖
  2. 开启组件扫描,告知Spring
  3. 使用注解
<!--
	1、use-default-filters:默认配置
	2、context:include-filter:指定扫描配置
	3、context:exclude-filter:指定不扫描的配置
-->
<context:component-scan base-package="xx.xx,xx.xx" use-default-filters="false">
	<context:include-filter type="annotation" expression="xx.xx.xx"/>
	<context:exclude-filter type="annotation" expression="xx.xx.xx"/>
</context:component-scan>

4.2、Spring针对Bean管理中属性注入提供的注解介绍

(1)@AutoWired(根据属性类型进行自动装配)
(2)@Qualifier(根据属性名称进行注入)
(3)@Resource(可以根据属性类型注入,也可以根据属性名称注入,javax提供的)
(4)@Value(注入普通属性,如String类型,上面三个都是Object类型)

特点:以上的注解都可以用来创建bean实例的属性

上一篇:Spring5复习IOC与AOP


下一篇:spring5源码分析系列(五)——IOC容器的初始化(三)