• 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调用它,否则就不会调用它。
  • 相关阅读:
    linux笔记
    restful课程凌杂知识点
    Django中间件执行流程
    restful知识点之二restframework视图
    restful知识点之一CBV
    可变长参数
    函数的重点内容
    文件的高级应用及修改的两种方式
    文件的三种打开方式及with管理文件上下文
    字符编码
  • 原文地址:https://www.cnblogs.com/xc-xinxue/p/12380188.html
Copyright © 2020-2023  润新知