zoukankan      html  css  js  c++  java
  • Spring Bean的生命周期、后置处理器、定义继承

    目录:

    1. 了解Spring的基本概念

    2. Spring简单的示例

    3. Spring Bean的定义及作用域

    1.Bean的生命周期

    Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

    在其生命周期里,有两个重要的回调方法,可以在初始化Bean和销毁Bean时调用该方法。

    在这两个方法里可以额外做一些操作。

    首先准备一个类

    public class Category {
        //属性
        private String name;
        SimpleDateFormat df=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.sss");
        //设置该属性的方法
        public void setName(String name){
            this.name=name;
        }
        //获取该属性的方法
        public void getName(){
            System.out.println(name);
        }
        //初始化回调
        public void start(){
            System.out.println("Bean开始使用时间:"+df.format(new Date()));
        }
        //销毁回调
        public void destroy(){
            System.out.println("Bean销毁时间:"+df.format(new Date()));
        }
    }

    再准备一个测试类

    public class TestSpring {
        public static void main(String[] args) throws InterruptedException {
            AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            Category category = (Category) context.getBean("c");
            category.getName();
            //睡眠1秒,更加明显看出两个方法的区别
            Thread.sleep(1000);
            context.registerShutdownHook();
        }
    }    

    测试类中,需要调用AbstractApplicationContext的registerShutdownHook()方法来确保正常关闭,并且调用相关的销毁的回调方法。

    配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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-3.0.xsd">
        <bean id="c" class="SpringBean.Base.Category" init-method="start" destroy-method="destroy">
            <property name="name" value="Hello Word"/>
        </bean>
    </beans>

    配置文件中,需要指定初始化回调的方法和销毁回调的方法。

    最后输出的是:

    Bean开始使用时间:2019-11-21 15:10:21.021
    Hello Word
    Bean销毁时间:2019-11-21 15:10:22.022

    2.Bean的后置处理器

    后置处理器就是在初始化方法的前后进行额外的操作。

    上面的Category方法代码不变,再准备一个针对Category初始化的类,就叫initCategory 

    public class initCategory implements BeanPostProcessor {
    
        @Override
        //会在bean初始化方法前执行
        public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
            System.out.println("初始化之前执行:"+s);
            return o;
        }
    
        @Override
        //会在bean初始化方法后执行
        public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
            System.out.println("初始化之后执行:"+s);
            return o;
        }
    }

    这个类需要实现BeanPostProcessor 接口,并重写其两个方法,方法内就可以写你需要的额外操作。

    保持上面的配置文件不变,再加上一句:

    <bean class="SpringBean.Base.initCategory"/>

    class属性里写上自己的initCategory 类所在的位置

    最后输出:

    初始化之前执行:c
    Bean开始使用时间:2019-11-21 15:16:12.012
    初始化之后执行:c
    Hello Word
    Bean销毁时间:2019-11-21 15:16:13.013

     3.Bean的定义继承

    bean的定义可以包含一大堆配置,比如:属性的值,构造函数的参数等。当其他bean需要用到这些设置时,不需要重新配置,只需要继承即可。

    继承的用法就相对简单了,在上面代码基础上。可以再添加一个Category2类。内容与Category一样,再添加额外的属性name2和setName2,getName2方法。

    并在配置文件中添加如下代码:

     <bean id="c2" class="SpringBean.Base.Category2" parent="c">
            <property name="name2" value="Hello Word2"/>
        </bean>

    可以发现,c2中设置了parent属性,继承id为‘c’的bean。

    设置属性当中,只设置了name2,并没有设置name的值,但是调用Category2的getName方法,依旧会输出Hello Word

  • 相关阅读:
    CentOs 安装 Mysql
    安装 CentOs 系统 及 Python 及 Scrapy 框架
    对IOC的理解
    SQL语句优化 -- 以Mysql为例
    探讨 java中 接口和对象的关系
    Java中组合 设计技巧 实例
    【题解】Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths Codeforces 741D DSU on Tree
    【题解】Tree-String Problem Codeforces 291E AC自动机
    【题解】打地鼠 SDOI2011 模拟 行列无关
    【题解】新型城市化 HAOI2017 网络流 二分图最大匹配 强连通分量
  • 原文地址:https://www.cnblogs.com/lbhym/p/11905952.html
Copyright © 2011-2022 走看看