• 【转】 SpringBoot(14)—注解装配Bean


    【转】 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)
    
  • 相关阅读:
    家谱树 x
    codevs 1231 最优布线问题 x(find函数要从娃娃抓起系列)
    洛谷 P1546 最短网络 Agri-Net x
    codevs 5969 [AK]刻录光盘x
    家谱(gen)x
    [POJ2594]Treasure Exploration(最小路径覆盖变种,floyd算法,匈牙利算法)
    [HDOJ5855]Less Time, More profit(最大权闭合子图,二分,最大流)
    [HDOJ1054]Strategic Game(最小点覆盖,最大二分匹配,HK算法)
    [HDOJ3829]Cat VS Dog(最大独立集)
    [HDOJ3488]Tour(二分图最小匹配,KM算法)
  • 原文地址:https://www.cnblogs.com/Javastudy-note/p/13818091.html
Copyright © 2020-2023  润新知