SpringBoot(14)—註解裝配Bean
SpringBoot裝配Bean方式主要有兩種
- 通過Java配置檔案
@Bean
的方式定義Bean。 - 通過註解掃描的方式
@Component/@ComponentScan
。
一、當前專案裝配Bean
建立專案名稱為create-bean
。
1、@Component方式
@Component("componentBean")
public class ComponentBean {
private String type = "@Component例項化bean";
public String getName(String name) {
return name + " ___ " + type;
}
}
說明
註解@Component 表明這個類將被Spring IoC容器掃描裝配,bean的名稱為componentBean。 如果不配置這個值 ,那IoC 容器就會把類名第一個字母作為小寫,其他的不變作為 Bean 名稱放入到 IoC 容器中。
2、@Bean方式
1)、POJO類
public class ConfigBean {
private String type = "Configuration註解生成bean實體";
public String getName(String name) {
return name + " ___ " + type;
}
}
2)BeanConfig類
/**
* @Description: 生成Bean
*/
@Configuration
public class BeanConfig {
@Bean
public ConfigBean configBean() {
return new ConfigBean();
}
}
@Configuration
代表是一個 Java 配置檔案 , Spring會根據它來生成 IoC 容器去裝配 Bean。
@Bean
代表將 configBean方法返回的 POJO 裝配到 IoC 容器中, name為Bean 的名稱,如果沒有配置它,則會將方法名稱作為 Bean 的名稱儲存到 Spring IoC 容器中 。
3、測試
/**
* @Description: 當前工程下的bean實體測試
*/
@RestController
public class BeanController {
/**
* 1、經典的註解引入方式 就是在@Configuration註解下生存bean
*/
@Autowired
private ConfigBean configBean;
/**
* 2、通過@Component方式注入bean 這裡通過構造方法引入方式(也可和同上通過@Autowired注入)
*/
private ComponentBean componentBean;
public BeanController(ComponentBean componentBean) {
this.componentBean = componentBean;
}
@GetMapping(path = "/bean")
public String show(String name) {
Map<String, String> map = new HashMap(16);
map.put("ComponentBean", componentBean.getName(name));
map.put("ConfigBean", configBean.getName(name));
return JSON.toJSONString(map);
}
}
示例
bean實體成功!
二、裝配第三方 Bean
上面介紹的Bean,在一個專案中可能不會出現什麼問題,可如果你提供了一個Jar包供第三方使用者使用,那麼你這個jar包中的Bean,就不能被第三方載入,那麼如何才能被載入呢?
建立專案名稱為third-bean
。
1、通過@Bean方式
POJO實體
/**
* @Description: 通過Configuration註解生成bean實體
*/
@Slf4j
public class ThirdConfigBean {
private String type = "第三方 ThirdConfigBean註解生成bean實體";
public String getName(String name) {
return name + " ___ " + type;
}
}
BeanConfig
@Configuration
//@ComponentScan("com.jincou.third") 當前專案包名
public class BeanConfig {
@Bean
public ThirdConfigBean thirdConfigBean() {
return new ThirdConfigBean();
}
}
這個時候在將配置放在指定的檔案中即可,使用者會自動載入,從而避免的程式碼的侵入
- 在資源目錄下新建目錄 META-INF
- 在 META-INF 目錄下新建檔案
spring.factories
- 在檔案中新增
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.jincou.third.config.BeanConfig
這個時候thirdConfigBean就可以能被第三方jar使用了。
2、@Component方式
@Component
public class ThirdComponentBean {
private String type = "第三方ThirdComponent註解生成bean實體";
public String getName(String name) {
return name + " ___ " + type;
}
}
說明
如果是@Component方式,那麼第三方jar包依然無法例項化當前Bean的,除非,在上面的BeanConfig將@ComponentScan註解開啟,同時滿足@ComponentScan註解能夠掃描到ThirdComponentBean實體,那麼久可以例項化該Bean。
3、測試
說明
我建立了兩個專案 create-bean
和third-bean
同時third-bean當作jar被create-bean引用,這個時候測上面的Bean能否被例項化。
在create-bean專案新建ThirdBeanController
/**
* @Description: 引入第三方的bean實體測試
*/
@RestController
public class ThirdBeanController {
/**
* 1、通過@Component方式注入bean
*/
@Autowired
private ThirdComponentBean thirdComponentBean;
/**
* 2、經典的註解引入方式 就是在@Configuration註解下生存bean
*/
@Autowired
private ThirdConfigBean thirdConfigBean;
@GetMapping(path = "/third-bean")
public String show(String name) {
Map<String, String> map = new HashMap(16);
map.put("ThirdComponentBean", thirdComponentBean.getName(name));
map.put("ThirdConfigBean", thirdConfigBean.getName(name));
return JSON.toJSONString(map);
}
}
測試如下
上面講的可能並沒有那麼好理解,這邊提供GitHub專案原始碼: https://github.com/yudiandemingzi/SpringBoot,
涉及到兩個專案 create-bean
和third-bean
參考
只要自己變優秀了,其他的事情才會跟著好起來(中將2)