一、容器中注入组件 1,包扫描 + 组件标注注解
源码:Demo01_ComponentScan
a)组件标注@Controller
@Service
@Repository
@Component
b)包扫描@ComponentScan@ComponentScan中主要值的解释
value:扫描的包路径(数组)
excludeFilters:指定扫描的时候按照什么规则排除那些组件(@ComponentScan.Filter)includeFilters:指定扫描的时候只需要包含哪些组件。使用同excludeFilter。
FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:使用正则指定
FilterType.CUSTOM:使用自定义规则
useDefaultFilters:是否使用默认的扫描机制。默认按照a)中组件标注扫描
2,使用@Bean导入 a)@Scope作用域prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象;
singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取就是直接从容器(map.get())中拿,
request:同一次请求创建一个实例
session:同一个session创建一个实例
b)@Lazy单实例bean:默认在容器启动的时候创建对象;
懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化。
c)@Conditional@Bean上加改注解,按照一定的条件进行判断,满足条件给容器中注册bean;如在类上加改注解,这个类中配置的所有bean注册才能生效。
@ConditionalOnClass 表示如果有后面的类,那么就加载这个自动配置;
@ConditionalOnMissingClass 如果没有后面的类,才自动配置。如果没有就配置,保证bean的唯一。
大量运用于SpringBoot中。
3,使用@Import导入源码:Demo02_Import
快速为容器中导入一个组件。
@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
ImportSelector:返回需要导入的组件的全类名数组
ImportBeanDefinitionRegistrar:手动注册bean到容器中
4,FactoryBean(工厂Bean)源码:Demo03_FactoryBean
将实现FactoryBean的类加到容器中。
默认从容器中获取到的是工厂bean调用getObject创建的对象。
要获取工厂Bean本身,我们需要给id前面加一个&
二、Bean的生命周期 1,bean生命周期bean创建 --- 初始化 --- 销毁
构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
初始化:
成员变量赋值,各种增强等,对象创建完成,并赋值好,调用初始化方法
销毁:
单实例:容器关闭的时候
多实例:容器不会管理这个bean;容器不会调用销毁方法;
2,定义Bean初始化和销毁 a)定义initMethod和destroyMethod源码:Demo04_BeanLifeCycle、Car
定义初始化方法,定义@Bean的initMethod为该方法
定义销毁方法,定义@Bean的destroyMethod为该方法
b)实现InitializingBean和DisposableBean接口 源码:Demo04_BeanLifeCycle、Dog
定义当前对象实现InitializingBean接口。其中afterPropertiesSet方法会在当前对象设置完属性之后调用。
定义当前对象实现DisposableBean接口。其中destroy方法会在当前对象销毁的时候调用。
c)可以使用JSR250 源码:Demo04_BeanLifeCycle、Color
@PostConstruct定义在方法上,则该方法会在Bean创建并且属性赋值之后执行,为初始化方法
@PreDestroy定义在方法上,则该方法在容器销毁bean之前通知我们进行清理工作
d)实现BeanPostProcessor,bean的后置处理源码:Demo04_BeanLifeCycle、Demo04_BeanPostProccessor
在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作
3,从源码看BeanPostProcessor后置处理器在Spring类AbstractAutowireCapableBeanFactory中方法doCreateBean可以看到