spring bean的初始化方式(init,destroy)

时间:2022-08-06 19:45:07

spring容器中bean的初始化方式大体有三种:

@PostConstruct ,@PreDestroy:  从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy。@PostConstruct会在Servlet构造函数之后,初始化之前执行

package com.edu.bean;


import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Created by IntelliJ IDEA.
 * User: chenzhubing
 * Date: 2019/6/17
 */
@Component
public class Color {

    @PostConstruct
    public void init(){
        System.out.println("init......");

    }

    @PreDestroy
    public void destroy(){
        System.out.println("destroy.........");

    }


}

package com.edu.bean;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Created by IntelliJ IDEA.
 * User: chenzhubing
 * Date: 2019/6/17
 */
public class Test1 {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.edu.bean");
        context.close();

    }
}

输出:

init......

destroy.........

  • @Bean中指定initMethod,destroyMethod方法
package com.edu.bean;


import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Created by IntelliJ IDEA.
 * User: chenzhubing
 * Date: 2019/6/17
 */

public class Color {

    @PostConstruct
    public void init(){
        System.out.println("init......");

    }

    public void init1(){
        System.out.println("init1......");

    }

    @PreDestroy
    public void destroy(){
        System.out.println("destroy.........");

    }

    public void destroy1(){
        System.out.println("destroy1.........");

    }


}


package com.edu.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by IntelliJ IDEA.
 * User: chenzhubing
 * Date: 2019/6/17
 */
@Configuration
class Config {

    @Bean(name = "color",initMethod = "init1",destroyMethod = "destroy1")
    public  Color getColor(){

        return new Color();
    }

}


package com.edu.bean;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Created by IntelliJ IDEA.
 * User: chenzhubing
 * Date: 2019/6/17
 */
public class Test1 {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        context.close();

    }
}

输出:

init......
init1......

destroy.........
destroy1.........

证明@PostConstruct 修饰的方法是在initMethod标注的方法之前执行,@PreDestroy修饰的方法是在destroyMethod 标注的方法之前执行

 

  • interface InitializingBean,DisposableBean:重写afterPropertiesSet,destroy方法
package com.edu.bean;


import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Created by IntelliJ IDEA.
 * User: chenzhubing
 * Date: 2019/6/17
 */
@Component
public class Color implements InitializingBean, DisposableBean {

    @PostConstruct
    public void init(){
        System.out.println("init......");

    }
    @PreDestroy
    public void destroy(){
        System.out.println("destroy.........");

    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("init1.........");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("destroy1......");
    }
}


package com.edu.bean;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Created by IntelliJ IDEA.
 * User: chenzhubing
 * Date: 2019/6/17
 */
public class Test1 {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.edu.bean");
        context.close();

    }
}

输出:

init......
init1.........

destroy.........
destroy1......