zoukankan      html  css  js  c++  java
  • spring学习(二十四)--@PostConstruct和@PreDestroy

    @PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。

    @PostConstruct

    @PostConstruct在构造方法和init方法(如果有的话)之间得到调用,且只会执行一次。其实从依赖注入的字面意思就可以知道,要将对象A注入到对象B,那么首先就必须得生成对象B和对象A,才能执行注入。所以,如果一个类B中有个成员变量A被@Autowried注解注入,那么@Autowired注入是发生在B的构造方法执行完之后的。 如果想在生成对象B时完成某些初始化操作,而偏偏这些初始化操作又依赖于A注入,那么就无法在构造函数中实现。可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖A注入完成后被自动调用,而且@PostConstruct方法只会被调用一次。

    @PreDestroy

    @PreDestroy注解的方法在destory()方法调用后得到执行。

    例子:

    LittleBall.java

    package serviceImpl;
    
    import interfaces.GirlsInterface;
    
    public class LittleBall implements GirlsInterface{
    
        public String girlsName;
        
        /**
         * 重写构造函数,输出信息,来确定bean初始化时间
         */
        public LittleBall(){
            System.out.println("Hello, I am little ball! I am very beautiful!");
        }
        
        public String getGirlsName(){
            return girlsName;
        }
        public void setGirlsName(String girlsName) {
            this.girlsName = girlsName;
        }
    }

    PostConstructAnnotion.java
    package springAnnotions;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.stereotype.Component;
    import serviceImpl.LittleBall;
    
    /**
     * 其实从依赖注入的字面意思就可以知道,要将对象A注入到对象B,那么首先就必须得生成对象B和对象A,才能执行注入。
     * 所以,如果一个类B中有个成员变量A被@Autowried注解注入,那么@Autowired注入是发生在B的构造方法执行完之后的。
     * 如果想在生成对象B时完成某些初始化操作,而偏偏这些初始化操作又依赖于A注入,那么就无法在构造函数中实现。
     * 可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖A注入完成后被自动调用
     * 而且@PostConstruct方法只会被调用一次
     * @author qiaozhong
     */
    
    @Component
    public class PostConstructAnnotion {
        
        @Autowired
        private LittleBall littleBall;
        
        public PostConstructAnnotion() {
            System.out.println("我是PostConstructAnnotion的构造函数,是在PostConstructAnnotion初始化bean的时候被调用执行的");
        }
        
        @PostConstruct
        public void postConstruct(){
            System.out.println("@PostConstruct注解是在容器启动时候,在LittleBall被注入之后调用执行的,而且只会执行一次,littleBall=" + littleBall);
        }
        
        @PreDestroy
        public void preDestroy(){
            System.out.println("@preDestroy注解是在bean销毁时,在执行destroy()方法之后执行的");
        }
        
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springConfig/spring-all.xml");
            PostConstructAnnotion postConstructAnnotion = (PostConstructAnnotion)context.getBean("postConstructAnnotion");
            context.destroy();
        }
    }

    执行main函数结果:

    我是PostConstructAnnotion的构造函数,是在PostConstructAnnotion初始化bean的时候被调用执行的
    Hello, I am little ball! I am very beautiful!
    @PostConstruct注解是在容器启动时候,在LittleBall被注入之后调用执行的,而且只会执行一次,littleBall=serviceImpl.LittleBall@5136d012
    2019-11-07 16:00:39.610 [main] org.springframework.context.support.ClassPathXmlApplicationContext INFO - Closing org.springframework.context.support.ClassPathXmlApplicationContext@6bf2d08e: startup date [Thu Nov 07 16:00:38 CST 2019]; root of context hierarchy
    @preDestroy注解是在bean销毁时,在执行destroy()方法之后执行的

    1、先执行了PostConstructAnnotion的构造函数,又执行了LittleBall的构造函数。在LittleBall注入到PostConstructAnnotion之后,执行了@PostConstruct注解的方法postConstruct()。

    2、在执行context.destroy()销毁bean的时候,调用了PostConstructAnnotion的destroy()方法,然后调用了@PreDestroy注解的方法preDestroy()。

    个人理解,如有错误,欢迎指正!
  • 相关阅读:
    js格式化文件大小,单位:Bytes、KB、MB、GB
    Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据
    ExtJs定时消息提示框,类似于QQ右下角提示,ExtJs如何定时向后台发出两个请求并刷新数据实例
    Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案
    Java 防SQL注入过滤器(拦截器)代码
    mysql8源码安装和MGR
    linux基础
    ThreadLocal
    redis缓存雪崩、穿透、击穿概念及解决办法
    ThreadLocal可能引起的内存泄露
  • 原文地址:https://www.cnblogs.com/gllegolas/p/11812749.html
Copyright © 2011-2022 走看看