Spring的IOC常用注解(含源码)

一、容器中注入组件 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可以看到

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssyfp.html