Spring IOC的概念(二)

什么是Bean?

就是将某个类注册为bean,并用id为其取个名字,在通过容器的getBean方法获取这个类的实例对象,然后就可以调用这个类的方法了。所以bean就是相当于new一个对象,只不过它是容器帮你生成的。

Spring Bean的生命周期


2020-02-28_203842

其中BeanPostProcess接口是针对所有的bean而言的。

当一个bean实现了上述接口,我们只需要Spring IOC容器中定义它就可以了,Spring IOC容器会自动识别,并按顺序执行。

测试步骤

1.生产果汁

public class Source {
    private String fruit;//类型
    private String sugar;//糖分描述
    private String size;//大小杯
    //setter getter
}

2.店里售卖果汁

public class JuiceMaker implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{
    private String beverageShop=null;
    private Source source=null;
    //setter getter
    
    public void myInit() {
        System.out.println("【"+this.getClass().getSimpleName()+"】执行自定义初始化方法");
    }
    public void myDestroy() {
        System.out.println("【"+this.getClass().getSimpleName()+"】执行自定义销毁方法");
    }
    public String makeJuice() {
        String juice="这是一杯由"+beverageShop+"饮品店,提供的"+source.getSize()+source.getSugar()+source.getFruit();
        return juice;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("调用接口DisposableBean的destroy方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("【"+this.getClass().getSimpleName()+"】调用InitializingBean接口的afterPropertiesSet方法");

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("【"+this.getClass().getSimpleName()+"】调用ApplicationContextAware接口的setApplicationContext方法");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("【"+this.getClass().getSimpleName()+"】调用BeanFactoryAware接口的setBeanFactory方法");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("【"+this.getClass().getSimpleName()+"】调用BeanNameAware接口的setBeanName方法");
    }

}

3.自定义BeanPostProcess方法

//BeanPostProcessor的这两个方法都是针对全部bean而言的
public class BeanPostProcessorImpl implements BeanPostProcessor{
    //预初始化方法
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("【"+bean.getClass().getSimpleName()+"】对象"+beanName+"开始实例化");
        return bean;
    }
    //后初始化方法
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("【"+bean.getClass().getSimpleName()+"】对象"+beanName+"实例化完成");
        return bean;
    }
}

4.现场配置所需类型果汁

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
     
     <bean id="beanPostProcessor" class="test4.BeanPostProcessorImpl"/>
    
    <bean id="source" class="test4.Source">
        <property name="fruit" value="橙汁"/>
        <property name="sugar" value="少糖"/>
        <property name="size" value="大杯"/>
    </bean>
    <bean id="juiceMaker" class="test4.JuiceMaker" init-method="myInit" destroy-method="myDestroy">
        <property name="beverageShop" value="贡茶"/>
        <property name="source" ref="source"/>
    </bean>
</beans>

5.得到果汁并附加其它功能

//对于我来说我只是想要一杯果汁,我直接找贡茶饮品店去买,而贡茶饮品店是怎么制作的我不关心
    //对于饮品店来说,它提供店面,找别人外包商提供果汁就行了,外包商专业做果汁的,他就能很专业的做好果汁
    public static void main(String[] args) {
        //配置文件跟包是并列的
        ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("spring-cfg.xml");
        JuiceMaker juiceMaker =(JuiceMaker)ctx.getBean("juiceMaker");
        System.out.println(juiceMaker.makeJuice());
        ctx.close();
    }
结果:
【Source】对象source开始实例化
【Source】对象source实例化完成
【JuiceMaker】调用BeanNameAware接口的setBeanName方法
【JuiceMaker】调用BeanFactoryAware接口的setBeanFactory方法
【JuiceMaker】调用ApplicationContextAware接口的setApplicationContext方法
【JuiceMaker】对象juiceMaker开始实例化
【JuiceMaker】调用InitializingBean接口的afterPropertiesSet方法
【JuiceMaker】执行自定义初始化方法
【JuiceMaker】对象juiceMaker实例化完成
这是一杯由贡茶饮品店,提供的大杯少糖橙汁
调用接口DisposableBean的destroy方法
【JuiceMaker】执行自定义销毁方法

假如不注册<bean id="beanPostProcessor" class="test4.BeanPostProcessorImpl"/>

结果如下:

【JuiceMaker】调用BeanNameAware接口的setBeanName方法
【JuiceMaker】调用BeanFactoryAware接口的setBeanFactory方法
【JuiceMaker】调用ApplicationContextAware接口的setApplicationContext方法
【JuiceMaker】调用InitializingBean接口的afterPropertiesSet方法
【JuiceMaker】执行自定义初始化方法
这是一杯由贡茶饮品店,提供的大杯少糖橙汁
调用接口DisposableBean的destroy方法
【JuiceMaker】执行自定义销毁方法
就没有调用BeanPostProcess里的方法。说明实现了这个接口并在spring容器中注册后,就会自动为所有bean调用它,否则就不会调用它。
原文地址:https://www.cnblogs.com/xc-xinxue/p/12380188.html