Spring容器中bean实现初始化方法和销毁方法

三种bean的 初始化和销毁方法:

     第一种,利用@Bean注解中自带的 initMethod()和 destroyMethod()。

package com.test;

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

/**
 * @Description //TODO
 * @Author GaoX
 * @Date 2020/7/20 11:13
 */
@Configuration
public class TestBean {

    @Bean(initMethod ="init", destroyMethod = "destroy")
    public Dog createDog(){
        return new Dog();
    }

}

====================================================================================

package com.test;

public class Dog {

    public void init() {
        System.out.println("----Dog----afterPropertiesSet two--------");
    }

    public void destroy() {
        System.out.println("----Dog----destroy two--------");
    }
}

====================================================================================

public static void main(String[] args){
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestBean.class);
    System.out.println(context.getBean(Dog.class));
    context.close();
}

  第二种,实现 InitializingBean和 DisposableBean接口中的 afterPropertiesSet()和 destroy()方法。

package com.test;

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

public class Cat implements InitializingBean, DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("----Cat----destroy--------");
    }

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

 ====================================================================================

package com.test;

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

/**
 * @Description //TODO
 * @Author GaoX
 * @Date 2020/7/20 11:13
 */
@Configuration
public class TestBean {

    //初始化提示和销毁提示 :通过实现接口方法
    @Bean
    public Cat createCat(){
        return new Cat();
    }

}

 ====================================================================================

public static void main(String[] args){
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestBean.class);
    System.out.println(context.getBean(Cat.class));
    context.close();
}

  第三种,可以使用JSR250,@PostConstruct(在bean创建完成并且属性赋值完成;来执行初始化方法)和 @PreDestroy(在容器销毁bean之前通知我们进行清理工作)

package com.test;

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

public class Apple {
    //初始化注解
    @PostConstruct
    public void init(){
        System.out.println("----Apple----init--------");
    }
    //销毁注解
    @PreDestroy
    public void destroy(){
        System.out.println("----Apple----destroy--------");
    }
}

 ====================================================================================

package com.test;

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

/**
 * @Description //TODO
 * @Author GaoX
 * @Date 2020/7/20 11:13
 */
@Configuration
public class TestBean {

    @Bean
    public Apple createApple(){
        return new Apple();
    }

}

 ====================================================================================

public static void main(String[] args){
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestBean.class);
    System.out.println(context.getBean(Apple.class));
    context.close();
}
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

注意:@Configuration注解的配置类有如下要求:

@Configuration不可以是final类型;
@Configuration不可以是匿名类;
嵌套的configuration必须是静态类。
一、用@Configuration加载spring
1.1、@Configuration配置spring并启动spring容器
1.2、@Configuration启动容器+@Bean注册Bean
1.3、@Configuration启动容器+@Component注册Bean
1.4、使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法
1.5、配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)

二、组合多个配置类
2.1、在@configuration中引入spring的xml配置文件
2.2、在@configuration中引入其它注解配置
2.3、@configuration嵌套(嵌套的Configuration必须是静态类)
三、@EnableXXX注解
四、@Profile逻辑组配置
五、使用外部变量

一、@Configuation加载Spring方法
1.1、@Configuration配置spring并启动spring容器
@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)
SpringBoot项目初始化
1、 创建自定义类实现 CommandLineRunner接口,重写run()方法。springboot启动之后会默认去扫描所有实现了CommandLineRunner的类,并运行其run()方法。
@Component
@Order(2)   //通过order值的大小来决定启动的顺序
public class AskForLeave implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        askForLeave();
    }

    public void askForLeave(){
        System.out.println("项目启动了,执行了方法");
    }
}
2、创建自定义类实现ApplicationRunner 接口,重写run()方法。

@Component
@Order(3)
public class Hello implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {

        hello();
    }

    public void hello(){
        System.out.println("项目又启动了,这次使用的是:继承 ApplicationRunner");
    }
}
关于二者的区别:

其实并没有什么区别,如果想获取更加详细的参数的时候,可以选择使用ApplicationRunner接口。其参数类型为:ApplicationArguments 。

还有一种方法
实现ApplicationListener<ContextRefreshedEvent>接口

package bdc.base;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

import bdc.ws.dao.CommonDao;
import bdc.ws.entity.RsaKey;
//@Component  使用这个注解或者采用bean注入<bean id="afterSpringBegin" class="bdc.base.AfterSpringBegin"></bean>
public class AfterSpringBegin implements
    ApplicationListener<ContextRefreshedEvent> {

  @Resource
  private CommonDao commonDao;
  public static final Map<String, RsaKey> KEY_RSA = new HashMap<String, RsaKey>();

  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {

    if (event.getApplicationContext().getParent() == null) {
      try {
        List<RsaKey> selectAllRsaKey = commonDao.selectAllRsaKey();
        for (int i = 0; i < selectAllRsaKey.size(); i++) {
          KEY_RSA.put(selectAllRsaKey.get(i).getUserOrg(),selectAllRsaKey.get(i));
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

}
原文地址:https://www.cnblogs.com/gaomanito/p/9604569.html