SpringBoot(14)—注解装配Bean

SpringBoot(14)—注解装配Bean

SpringBoot装配Bean方式主要有两种java

  • 经过Java配置文件@Bean的方式定义Bean。
  • 经过注解扫描的方式@Component/@ComponentScan

1、当前项目装配Bean

建立项目名称为create-beangit

一、@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 容器中。github

二、@Bean方式

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


2、装配第三方 Bean

上面介绍的Bean,在一个项目中可能不会出现什么问题,可若是你提供了一个Jar包供第三方用户使用,那么你这个jar包中的Bean,就不能被第三方加载,那么如何才能被加载呢?code

建立项目名称为third-bean

一、经过@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使用了。

二、@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。

三、测试

说明 我建立了两个项目 create-beanthird-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
涉及到两个项目 autobeanthirdbean


参考

一、SpringBoot系列文章




只要本身变优秀了,其余的事情才会跟着好起来(中将2)
相关文章
相关标签/搜索