1、注册Bean组件方式
1、包扫描 + 组件标注注解(@Controller,@Service,@Repository,@Component)
2、@Bean[导入的第三方包里面的组件]
3、@Import[快速给容器中导入一个组件] (Spring源码常用)
1、@Import(要导入到容器中的组件):容器中就会自动注册这个组件,id默认是全类名
2、ImportSelect:返回需要导入的组件的全类名数组。
3、ImportBeanDefinitionRegistrar:手动注册bean到容器中
4、使用Spring提供的FactoryBean(工厂Bean)
1、默认获取到的就是bean调用getObject创建的对象。
2、要获取工厂Bean本身,我们需要给id前面加一个&
使用FactoryBean注册Bean举例
// 创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
// 返回一个Color对象,这个对象会添加到容器中
@Override
public Color getObject() {
return new Color();
}
// 返回类的类型
@Override
public Class<?> getObjectType() {
return Color.class;
}
// 是否为单例
@Override
public boolean isSingleton() {
return false;
}
}
@Bean
public ColorFactoryBean colorFactoryBean() {
return new ColorFactoryBean();
}
// 工厂bean获取的是getObject 创建的对象
AnnotationConfigApplicationContext application = new AnnotationConfigApplicationContext();
Object o1 = application.getBean("colorFactoryBean");
// 打印bean的类型 o1.getClass() = color
// 获取到的是bean工厂本身
Object o1 = application.getBean("&colorFactoryBean");
// 打印bean的类型 o1.getClass() = colorFactoryBean
2、Bean 生命周期
实例化:创建一个类的实例,也即一个对象。
初始化:为各类成员赋予初始值。
Bean的生命周期:
1、构造(对象创建) ----实例化
单实例:在容器启动的时候创建对象。
多实例:在每次获取的时候创建对象。
BeanPostProcessor.postProcessBeforeInitialization
2、初始化
对象创建完成,并赋值好,调用初始化方法。。
BeanPostProcessor.postProcessAfterInitialization
3、销毁:
单实例:容器关闭的时候
多实例:容器不会管理这个bean,容器不会调用销毁方法。
1、指定初始化和销毁方法:
通过@Bean指定init-method 和 destroy-method
2、通过让Bean实现initializingBean(定义初始化逻辑);DisposableBean(定义销毁逻辑);
3、可以使用JSR250;
@PostConstruct :在bean创建完成并且属性赋值完成;来执行初始化方法。
@PreDestroy:在容器销毁bean之前通知我们进行清理工作。
4、BeanPostProcessor[initerface]:bean 的后置处理器
在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:在初始化之前工作、
postProcessAfterInitialization:在初始化之后工作。
遍历得到容器所有的BeanPostProcessor,挨个执行beforeInitialization。一旦返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization。
BeanPostProcessor 原理:
populateBean(beanName, mbd, instanceWrapper):给bean进行属性赋值
initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd): 执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
}
Spring 底层对BeanPostProcessor 的使用:
bean赋值,注入其他组件:@Autowried, 生命周期注解功能,@Async, xxxx BeanPostProcessor;
3、自动装配
可以使用 @Autowired 或者 @Resource 等.
自定义组件想要使用Spring 容器底层的一些组件(ApplicationContext,BeanFactory,XXX)
自定义组件实现xxxAware:在创建对象的时候,会调用接口规定的方法注入相关组件,Aware。
把Spring底层一些组件注入到自定义的Bean中,
xxxAware : 功能使用xxxProcessor:
ApplicationContextAware ===》 ApplicationContextAwareProcessor;
@Component
public class Red implements ApplicationContextAware {
private ApplicationContext applicationContext;
private Red() {
System.out.println("Red 无参构造器的创建");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("Red创建完后的调用:" + applicationContext);
this.applicationContext = applicationContext;
}
}