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();
      }
    }
  }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM