SpringBoot Bean的注入


一、使用@configuration

可以理解為是spring的xml文件的beans部分定義。

a)如何定義?

  • 在類中加入@Configuration注解
  • 在方法加入@Bean注解完成bean的定義,也可以使用name指定bean注冊的名稱,默認為方法名。

b)如何使用?

  • 使用@Autowired注解注入或構造函數注入
 1 @Configuration
 2 public class ServicePriceConfiguration {
 3     /**
 4      * 顯式指定bean的名稱
 5      * @return
 6      */
 7     @Bean(name = "priceBean")
 8     PriceService initPriceBean() {
 9         return new PriceServiceImpl();
10     }
11 
12     /**
13      * 初始化productbean
14      * @return
15      */
16     @Bean
17     ProductService initProductBean() {
18         return new ProductServiceImpl();
19     }
20 
21     /**
22      * 初始化shoppingcar bean
23      * @return
24      */
25     @Bean
26     ShoppingCarService initCarBean() {
27         return new ShoppingCarServiceImpl();
28     }
29 }

bean的使用:

1     @Autowired
2     private ShoppingCarService shoppingCarService;
3 
4     @Autowired
5     private MemberService memberService;
6 
7     @Autowired
8     private MsgSender msgSender;

二、使用@service注解

a)如何定義?

即在具體的實現了方法加入@service注解

b)如何使用?

使用@Autowired 注解注入或構造函數注入

1 @Service
2 public class MemberServiceImpl implements MemberService {
3     @Override
4     public String getUserNameById(String userId) {
5         //TODO
6         return userId+":name";
7     }
8 }

使用:

1   @Autowired
2     private MemberService memberService;

三、自定義條件bean

所謂自定義條件bean就是在springboot上下文啟動的時候可以根據條件的判斷初始化滿足特定條件的bean,例如: 在項目中我們需要發送消息到QQ或微信,可以在系統啟動的時候通過配置文件進行指定,但是我們發送的實現方式是不一樣的。這時候可以選擇使用條件bean。

條件bean的使用步驟:

1)定義條件判斷class

在類啟動加載的時候返回true條件的bean會被初始化,在本例中我們先定義兩個條件class如下需要繼承Condition ,主要判斷為配置文件配置的屬性msg.sender 為QQ還是為Webchat。

 1 public class MsgSenderConditionQQ implements Condition {
 2 
 3     @Override
 4     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
 5         String msg = context.getEnvironment().getProperty("msg.sender");
 6         return "QQ".equals(msg);
 7     }
 8 }
 9 public class MsgSenderConditionWebchat implements Condition {
10 
11     @Override
12     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
13         String msg = context.getEnvironment().getProperty("msg.sender");
14         return "Webchat".equals(msg);
15     }
16 }

2)bean的初始化

bean的初始化定義到configuration類中,多一個注解@Conditional(MsgSenderConditionQQ.class) 並指定需要進行條件判斷的class

 1 /**
 2      * 條件bean
 3      * @return
 4      */
 5     @Bean
 6     @Conditional(MsgSenderConditionQQ.class)
 7     MsgSender  initMsgSenderQQ() {
 8         System.out.println("QQ msg sender init");
 9         return new MsgSenderQQ();
10     }
11 
12     /**
13      * 條件bean
14      * @return
15      */
16     @Bean
17     @Conditional(MsgSenderConditionWebchat.class)
18     MsgSender  initMsgSenderWebchat() {
19         System.out.println("webchat msg sender init");
20         return new MsgSenderWebchat();
21     }

3)配置文件加入判斷條

配置判斷屬性為QQ,即選擇加載QQ消息發送bean進行注入。

 1 #端口
 2 server:
 3   port: 8080
 4 spring:
 5   application:
 6     #名稱
 7     name: start
 8 
 9 #自定義屬性 Webchat QQ
10 msg:
11   sender: QQ

4)bean的啟動

 

 

 四、bean的初始化與銷毀

bean的初始化與銷毀主要有兩種方式

方式一:在configuration中使用 @bean 注解方式指定注解屬性

1         /**
2      * 顯式指定bean的名稱,初始化調用方法即銷毀調用方法
3      * @return
4      */
5     @Bean(name = "priceBean",initMethod = "init",destroyMethod = "destroy")
6     PriceService initPriceBean() {
7         return new PriceServiceImpl();
8     }

在priceServiceImpl實現類中寫init方法和destory方法:

public class PriceServiceImpl implements  PriceService{

    public void init(){
        System.out.println("bean init start...");
    }

    @Override
    public Double getPriceByProductCode(String productCode) {
        //TODO
        return new Double(1.2);
    }

    public void destroy(){
        System.out.println("bean destory...");
    }
}

方法二:使用方法注解 @PostConstruct @PreDestory

public class ProductServiceImpl implements ProductService {

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

    @Override
    public String getProductNameByProductCode(String id) {
        //TODO
        return "可樂";
    }

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

五、自帶的部分條件bean的使用

@ConditionalOnProperty(name="condition.onPropertyCondition",havingValue="true",matchIfMissing=true)

只有配置文件中(springBoot讀取的配置文件)有 condition.onPropertyCondition且該值為 true 時才裝配該Bean,如果該配置沒有value,使用matchIfMissing=true 也能裝配該Bean。

@ConditionalOnBean(name={"onPropertyCondition","dfgdfg"})

指定的Bean中只要有一個Bean存在於Spring IOC container 中則該Bean被裝配

1 @ConditionalOnMissingBean(name={"123","dfgdfg"})

指定的Bean中只要有一個Bean不存在於Spring IOC container 中則該Bean被裝配

@ConditionalOnClass(name={"com.google.gson.Gson"})

指定的class 必須全在classpath中存在 且邏輯合理

@ConditionalOnMissingClass(value={"com.google.gson.Gson",""})

指定的class 必須都不在classpath 且邏輯合理

 

參考鏈接:https://zhuanlan.zhihu.com/p/37967769


免責聲明!

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



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