一、使用@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