Spring注解归纳
一、配置注解
1. @Configuration 告诉Spring这是一个配置类,此注解等同于配置文件<bean></bean> (类上)
2. @ComponentScan value属性:指定要扫描的包 (类上)
excludeFilters = Filter[] ,指定扫描的时候按照什么规则排除哪些组件
FilterType.ANNOTATION 按照注解扫描
FilterType.ASSIGNABLE_TYPE 按照指定类型扫描
3. @Bean 注解在方法上,声明当前方法的返回值为一个bean,id默认是方法名。
二、声明 bean 的注解
@Component 组件,没有明确的角色
@Service 在业务逻辑层使用(service层)
@Repository 在数据访问层使用(dao层)
@Controller 在表现层使用,表示为SpringMVC的控制器
三、@Bean的属性支持
@Scope 设置Spring容器创建Bean实例的类型(方法上,和@Bean一起使用)
prototype:多实例的,ioc容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象。
singleton:单实例的,ioc容器启动会调用方法创建对象放到ioc容器中,以后每次获取就是直接从容器中拿 (map.get())。
request:同一次请求创建一个实例。
session:同一个session创建一个实例。
四、@Import 导入组件
@Import 快速给容器中导入一个组件
1. @Import(要导入的组件) 容器中就会自动注册这个组件,id默认是全类。
2. ImportSelector:返回需要导入的组件的全类名数组(实现该接口)
3. ImportBeanDefinitionRegistrar :手动注册bean到容器中(实现该接口)
五、bean 的生命周期
bean的声明周期分为:bean创建---初始化---销毁
1. 容器管理bean的生命周期
我们可以自定义初始化和销毁方法,容器在bean 进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。
调用无参构造(对象创建):
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
初始化:
对象创建完成,并属性赋值好,调用初始化方法。。。
销毁:
单实例:容器关闭时候销毁
多实例:容器不负责管理这个 bean,容器不会调用销毁方法。
2. 初始化和销毁方式
1)指定初始化和销毁方法
通过@Bean指定init-method和destory-method;
2)通过让 Bean 实现 InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)
3)可以使用JSR250:(使用在方法上)
@PostConstruct:在bean创建完成并且属性赋值完成,来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
4)BeanPostProcessor 接口 bean的后置处理器,在bean创建之后初始化完成前后进行一些处理工作
postProcessBeforeInitialization:初始化之前进行后置处理工作
postProcessAfterInitialization:初始化之后工作
3. BeanPostProcessor原理 bean的后置处理器
源码:
首先调用 populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
然后调用 initializeBean 进行初始化 {
创建完bean之后初始化之前:applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
执行自定义初始化:invokeInitMethods(beanName, wrappedBean, mbd);
创建完bean之后初始化之后:applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
Spring底层对 BeanPostProcessor的使用:
bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor 等都用到了BeanPostProcessor 。