本文仅做查询资料,不对细节进行论述
一、常用注释
@Configuration:一般用在IOC配置@Bean类头
@Bean:
IOC注入对象,无论@ComponentScan扫没扫到
@ComponentScan:
扫描文件@Controller,@Service,@Repository,@Component
自动扫描组件&指定扫描规则;
自定义TypeFilter指定过滤规则;
@Scope:
没用@Scope("prototype"),所有@Bean默认为单实例,在IOC容器启动时候创建Bean
使用了@Scope("prototype"),@Bean为非单例,在IOC容器启动后创建Bean,调用时候才执行Bean构造函数
@Lazy:
针对上述@Bean没有用@Scope时,可以让Bean在IOC容器启动后创建,调用时候才执行Bean构造函数
@Conditional:(SpringBoot底层大量使用)
按照一定条件进行判断,满足条件给容器中注册bean
@Conditional({LinuxCondition.class})
@Bean("linus"):表示只有linux环境才生效Bean
也可以配置在Config类头,表示整个类在某个条件下的Bean才生效
小结:
给容器中注册组件的方法:
1)包扫描+组件标注注解(@Controller/@Service/@Repository/@Component[局限在自己写的类])
2)@Bean[导入第三方包里面的组件]
3)@Import[快速给容器中导入一个组件]详情见Color
a)@Import(要导入到容器中的组件):容器中就会自动注册这个组件,id默认是全类名
b)ImportSelector:返回需要导入的组件的全类名数组
c)ImportBeanDefinitionRegistrar,自定义手工注册,例如:查找注册类中是否有Red和Blue,如果有的话注册yellow
4)使用Spring提供才FactoryBean(工厂Bean),做框架整合时候用的多
a)默认获取到的是工厂bean调用getOject创建的对象
b)要获取工厂Bean本身,我们需要给id前面加一个&
&colorFactoryBean
二、bean生命周期:
创建---初始化---销毁
容器管理bean的生命周期
我们可以自定义初始化和销毁方法:容器在bean进行到当前生命周期的时候来调用
我们自定义的初始化和销毁方法
构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
初始化:
对象创建完成,并赋值好,调用初始化方法
销毁:
单实例:容器关闭的时候
多实例:容器不会管理这个bean;不会调用销毁方法
1)指定初始化销毁方法
通过@Bean指定init-method和destroy-method;(BeanLifeCycleConfig)
2)通过让Bean实现InitializingBean,DisposableBean(定义初始化和销毁)(Cat类)
3)使用JSR250:
@PostConstruct:在Bean创建完成,并且属性赋值完成;来执行初始化(Dog类)
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
javax.annotation.*;
4)BeanPostProcessor[interface],bean的初始化后置处理器;
在bean的初始化前后进行一些处理工作;(参考MyBeanPostProcessor类)
postProcessBeforeInitialization,在任何初始化调用之前工作(InitializingBean);
postProcessAfterInitialization,在初始化之后工作;
结果如下:
Cat constructor...
MyBeanPostProcessor.postProcessBeforeInitialization...cat=> spring.com.bean.Cat@4450d156
Cat InitializingBean.afterPropertiesSet...(init)
MyBeanPostProcessor.postProcessAfterInitialization...cat=> spring.com.bean.Cat@4450d156
BeanPostProcessor是Spring底层使用非常频繁的接口,如:
bean赋值,注入其他组件,@Autowired,生命周期注释功能,@Async等等