SpringBoot(14)—注解裝配Bean


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-beanthird-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/spring-boot-study
涉及到兩個項目 autobeanthirdbean


### 參考 1、[SpringBoot系列文章](http://spring.hhui.top/spring-blog/SpringBoot/)

只要自己變優秀了,其他的事情才會跟着好起來(中將2)


免責聲明!

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



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