SpringBoot裝配Bean方式主要有兩種java
@Bean
的方式定義Bean。@Component/@ComponentScan
。建立項目名稱爲create-bean
。git
@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 容器中。github
1)、POJO類spring
public class ConfigBean { private String type = "Configuration註解生成bean實體"; public String getName(String name) { return name + " ___ " + type; } }
2)BeanConfig類springboot
/** * @Description: 生成Bean */ @Configuration public class BeanConfig { @Bean public ConfigBean configBean() { return new ConfigBean(); } }
@Configuration
表明是一個 Java 配置文件 , Spring會根據它來生成 IoC 容器去裝配 Bean。app
@Bean
表明將 configBean方法返回的 POJO 裝配到 IoC 容器中, name爲Bean 的名稱,若是沒有配置它,則會將方法名稱做爲 Bean 的名稱保存到 Spring IoC 容器中 。測試
/** * @Description: 當前工程下的bean實體測試 */ @RestController public class BeanController { /** * 一、經典的註解引入方式 就是在@Configuration註解下生存bean */ @Autowired private ConfigBean configBean; /** * 二、經過@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); } }
示例ui
bean實體成功!this
上面介紹的Bean,在一個項目中可能不會出現什麼問題,可若是你提供了一個Jar包供第三方用戶使用,那麼你這個jar包中的Bean,就不能被第三方加載,那麼如何才能被加載呢?code
建立項目名稱爲third-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(); } }
這個時候在將配置放在指定的文件中便可,使用者會自動加載,從而避免的代碼的侵入
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.jincou.third.config.BeanConfig
這個時候thirdConfigBean就能夠能被第三方jar使用了。
@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。
說明
我建立了兩個項目 create-bean
和third-bean
同時third-bean看成jar被create-bean引用,這個時候測上面的Bean可否被實例化。
在create-bean項目新建ThirdBeanController
/** * @Description: 引入第三方的bean實體測試 */ @RestController public class ThirdBeanController { /** * 一、經過@Component方式注入bean */ @Autowired private ThirdComponentBean thirdComponentBean; /** * 二、經典的註解引入方式 就是在@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/SpringBootBlog,
涉及到兩個項目 autobean
和thirdbean
只要本身變優秀了,其餘的事情纔會跟着好起來(中將2)