SpringIOC容器中Bean的注册、Bean的生命周期、自动装配

1、注册Bean组件方式

1、包扫描 + 组件标注注解(@Controller@Service@Repository@Component2@Bean[导入的第三方包里面的组件]
3@Import[快速给容器中导入一个组件]Spring源码常用)
	1@Import(要导入到容器中的组件):容器中就会自动注册这个组件,id默认是全类名
	2ImportSelect:返回需要导入的组件的全类名数组。
	3ImportBeanDefinitionRegistrar:手动注册bean到容器中
4、使用Spring提供的FactoryBean(工厂Bean1、默认获取到的就是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之前通知我们进行清理工作。
4BeanPostProcessor[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 容器底层的一些组件(ApplicationContextBeanFactory,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;
    }
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值