核心容器、Bean、DI
一、Spring Framework系统架构
(1)Core Container:核心容器(最核心部分)
【tips】系统架构图是上层依赖下层的关系。
(2)AOP:面向切面编程
Aspects:对AOP思想进行了实现
(3)Data Access/Integration:数据访问/集成
(4)Web:Web开发
(5)Test:单元测试与集成测试
二、Core Container(IoC容器)
为解决代码耦合度太高的问题(解耦)——IoC管理Bean+DI。
1.IoC
(1)IoC(Inversion of Control,控制反转)思想:
使用对象时,不再主动new一个对象,而是由外部提供对象。即对象的创建控制权由程序转移到外部,该思想称为IoC(控制反转)。
【tips】Spring提供了这样一个外部容器(IoC容器,即核心容器),用来充当IoC思想里的“外部”,提供程序所需的对象。
(2)IoC容器的作用:
负责对象的创建和初始化等工作,被创建或管理的对象在IoC容器中统称为Bean。
2.DI
(1)DI(Dependency Injection,依赖注入)思想:
在IoC容器中建立Bean与Bean之间依赖关系的这个过程,称为依赖注入。
【tips】将“有依赖的关系的”Bean进行关系绑定,如Service与Dao。
(2)作用:
使用对象时不仅可以直接从IoC容器中获取,并且获取到的Bean都已绑定了所有的依赖关系。
3.IoC和DI的使用
(1)导入Spring坐标
(2)定义Spring管理的类(接口)
不new对象,利用DI思想,通过set方法获得对象。
(3)创建Spring Config配置文件,配置对应类作为Bean,配置绑定依赖关系
放在resources下,起名applicationContext.xml
1)在<bean>里配置Bean
2)配置绑定依赖关系
“property”:属性标签
“name”:要获得的不new的那个对象
“ref”:要参照的那个xml中的Bean的id
【tips】谁要用这个对象,就在谁的<Bean>里配置绑定关系。
(4)创建IoC容器,通过该容器获取Bean
1)创建IoC容器,加载配置文件
2)获取Bean
(5)调用方法
4.Bean详解
(1)Bean的详细配置
(2)Bean的实例化
Bean的本质就是对象,那么如何创建Bean呢?
1)方法一:构造方法实例化Bean(常用)
通过无参构造方法创建Bean对象。
【tips】若没有无参构造方法,则报错:BeanCreationException。
2)方法二:静态工厂实例化Bean(了解)
静态工厂:
配置:
3)方法三:实例工厂实例化Bean(了解)
实例工厂:
配置:先配置工厂Bean,再配置Dao的Bean:
4)方法四:FactoryBean实例化Bean(★)
①创建XxxFactoryBean,实现FactoryBean<T>接口
②配置
(3)Bean的生命周期
1)初始化容器
①创建对象,分配内存
②执行构造方法
③执行属性注入(set操作)
④执行Bean初始化方法
2)使用Bean
执行业务操作
3)关闭/销毁容器
执行Bean销毁方法
【tips】①容器关闭前,触发Bean的销毁方法
②关闭容器的两种方式子:
a.手动关闭:
ClassPathXmlApplicationContext接口的close()方法
b.注册关闭钩子,在虚拟机退出前先关闭容器再退出:
ClassPathXmlApplicationContext接口的registerShutdownHook()方法
(4)Bean的生命周期控制
“控制”:指的是在生命周期内想做什么事情。
1)方法一:使用配置方式进行生命周期控制
①创建后控制
比如想在Bean创建后输出一句话“init...”:
a.创建初始化控制方法
b.配置该Bean的init-method
②销毁前控制
比如想在Bean销毁前输出一句话“destory...”:
a.创建销毁控制方法
b.配置该Bean的destory-method
2)使用接口方式进行生命周期控制
让Bean对象实现InitializingBean和DisposableBean接口,重写afterPropertiesSet和destroy两个方法。
三、依赖注入(DI)
1.依赖注入的方式——两种类型两种方法
(1)引用类型
1)setter注入
a.在bean对象中定义引用类型属性,并提供可访问的set方法
b.在<bean></bean>中用<property>标签的name(bean中定义的引用类型名)和ref属性注入需要的引用类型对象
2)构造器(constructor)注入
a.在bean对象中定义引用类型属性,并提供可访问的构造方法
b.在<bean></bean>中用<constructor-arg>标签的name(构造方法的参数名)和ref属性注入需要的引用类型对象
(2)简单类型(基本数据类型和String)
1)setter注入
a.在bean中定义简单类型属性,并提供可访问的set方法
b.在<bean></bean>中用<property>标签的name(bean中定义的简单类型名)和value(简单类型的值)注入需要的简单类型数据
2)构造器注入
a.在bean中定义简单类型属性,并提供可访问的构造方法
b.在<bean></bean>中用<constructor-arg>标签的name(构造方法的参数名)和value(简单类型的值)注入需要的简单类型数据
2.依赖注入方式的选择
(1)强制依赖使用构造器注入(使用setter注入有可能不进行注入而导致null对象出现),可选依赖使用setter注入,灵活性强;
(2)实际开发时还要根据实际情况分析,如果受控对象没有提供setter方法,就必须使用构造器注入;
(3)自己开发的模块推荐使用setter注入。
3.依赖自动装配
IoC容器根据Bean所依赖的资源在容器中自动查找并注入到Bean中的过程称为自动装配。
(1)自动装配的使用
配置中用bean标签的autowire属性进行自动装配。
(2)自动装配的方式
1)★按类型(byType)
要求类型唯一;
2)按名称(byName)
要求配置的受控Bean的id与定义的受控对象名相同,高耦合,不推荐使用。
【注意】①要有可访问的set方法②要配置受控的Bean
(3)注意事项
1)自动装配仅适用于依赖注入引用类型,不能对简单类型进行操作;
2)自动装配的优先级低于setter注入和构造器注入,同时出现时自动装配将失效。
4.集合注入
集合采用setter注入,需先定义集合对象并提供set方法,再配置:
(1)Array
【tips】集合注入的配置格式相似,用<property>的name属性表示定义的集合名,在<property></property>中用对应集合的标签和格式设置集合的值。
(2)List
(3)Set
(4)Map
(5)Properties
四、容器
1.两种创建容器的方式
(1)★通过加载类路径(项目下的src)下的配置文件创建容器
(2)从文件系统下加载配置文件创建容器、
需要的是配置文件的绝对路径(absolute path):
2.三种获取Bean的方式
(1)通过Bean的id获取Bean,需类型强转
(2)通过Bean的id和数据类型字节码文件获取Bean,无需强转
(3)通过Bean的类型字节码文件获取Bean,需要配置文件中类型唯一
3.容器类层次结构图
(1)通过BeanFactory初始化Bean(了解)
(2)BeanFactory与ClassPathXmlApplicationContext的不同
BeanFactory创建完毕后,所有的Bean均为延迟加载;后者创建完毕后为立即加载。后者若想延迟加载,需在配置时将lazy-init属性设置为true。