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
参考
来源: https://www.cnblogs.com/qdhxhz/p/11006289.html