Spring核心机制是IOC和依赖注入
Spring的控制反转:
IOC即控制反转,实现了解耦,对Bean的统一管理,实现依赖关系的反转,Ioc是靠工厂模式+代理模式实现的 Spring对Bean的管理是通过从属于Spring的配置文件来维护bean的依赖关系的
Spring依赖注入:
1、set注入 要求Java类中有属性以及属性的set方法,配合config.xml中对应bean的property 2、构造器注入 要求Java类中构造方法有参数(给属性赋值),配合config.xml中对应bean的constructor-arg 3、注解的方式注入
注入方式的优劣:
用set注入由于提供了set()方法不能保证相关数据在执行时不被更改设定值,而构造注入会在构造方法上留有很参数不易阅读建议set注入为主,构造注入为辅
Spring容器
Spring是作为一个容器存在的,应用中所有组件都处于Spring的管理之下,都被Spring以Bean的方式管理。Spring容器是生成Bean的工厂,所有组件都被当成Bean处理。Bean是Spring容器的基本单位。
(1)Bean是定义在Spring配置文件中的,之间可以互相协同工作完成复杂的关系
(2)bean的属性:id: 唯一标识,不能重复 name: 别名,可以配置多个别名用逗号隔开,程序中也可以使用 name的值获取该Bean实例。 class: Bean的来源,完整的包名和类名,必须指定 scope: 作用域,支持五种作用域,如下: 1、singleton:单例模式,每次通过getBean方式获取实例时都是 返回同一个Bean实例,默认模式 2、prototype:原型模式,每次通过getBean方式获取实例时都会 产生新的Bean实例
(3)Bean的生命周期
Bean的定义 Bean的初始化 方法一: Bean对应java类实现InitializingBean接口,覆盖 afterPropertiesSet()方法 方法二: 配置文件<bean>中声明init-method="init",再在 java类中写init()方法 Bean的应用 方法一: 使用BeanFactory 方法二: 使用ApplicationContext Bean的销毁 方法一:Bean对应的java类中实现DisposableBean接口, 覆盖destroy()方法 方法二:配置文件<bean>中声明destroy-method="cleanup", 再在java类中写cleanup()方法
(3)Bean的管理
BeanFactory: 延迟载入所有Bean直到getBean()方法被调用时Bean才创建 ApplicationContext: 在上下文启动后预载入所有的单实例Bean, 确保当需要的时候它们已经准备好了
(4)Bean的依赖关系
local: <property name="a"> <ref local="b"/> </property> bean: <property name="a"> <ref bean="b"/> </property> parent: <property name="a" ref="b"> </property>
(5)Bean的自动装配
自动装配可以相互协作bean之间的关联关系,自动指定被依赖的bean 使用property和constructor-arg注入依赖会覆盖自动装配。 Bean元素的自动装配时通过"autowire"属性来指定的,共有五种取值: 1. byName 根据java类中的属性名称自动在配置文件中根据bean的id值找匹配bean 2. byTyep 根据java类中的属性类型自动在配置文件中根据bean的class属性 找匹配的bean,没有匹配的bean不会报错,可以通过设置依赖检 查抛出异常(dependency-check="objects") 3. constructor 根据构造方法的参数类型来匹配,匹配规则同byType 4. autodetect 检查java类的内部来选择使用byType或constructor 5. no 不使用自动装配,必须通过ref来引用其他Bean为属性赋值
(5)两种后处理器
Bean后处理器: 负责处理容器中所有的Bean实例 实现BeanPostProcessor接口 覆盖两个方法(Bean的初始化前后被调用的方法), 注册该接口实现的Bean: <bean class=""></bean> 容器后处理器 负责处理容器本身 实现BeanFactoryPostProcessor接口, 覆盖方法(容器初始化成功被调用的方法) 注册该接口实现的Bean
代理机制
SpringAop(AspectJ/POJO/XML)
Spring注解
- 注解为bean:
@Component、@Controller、@Service、@Repository
分别代表:
组件、控制层、业务层、数据访问层(暂时没区别) - 注解依赖注入( 该自动注入不需要结合set、get方法):
@Autowired、@Resource - 使用注解必需开启自动扫描:
@ComponentScan()、
<context:component-scan base-package=""/>
- 注解为bean:
Spring源码解析
FactoryBean支持:
BeanFactory: Sping IOC容器的根接口, 提供获取bean,是否包含bean,是否单例与原型, 获取bean类型,bean别名的api HierarchicalBeanFactory:继承以上接口, 新增获取父BeanFactory的方法定义 ConfigurableBeanFactory:继承以上接口, 继承SingletonBeanRegistry接口, 并提供factory的配置功能
单例管理:
SingletonBeanRegistry: 提供单例注册,查询服务
DefaultSingletonBeanRegistry: 实现以上接口,
继承SimpleAliasRegistry,
单例的生命周期管理(创建,维护,销毁)
FactoryBeanRegistrySupport: 继承上面的类,
添加工厂方式创建FactoryBean的支持
AbstractBeanFactory:继承上面的类,
实现ConfigurableBeanFactory接口,
BeanFactory的抽象实现!!
别名管理:
AliasRegistry:定义beanName的别名管理
SimpleAliasRegistry:实现别名管理接口基础上
添加了canonicalName查找真实名称