前面一篇介绍了Bean的常用姿势,在一个项目中,可能不会出现什么问题,可如果你提供了一个Jar包供第三方用户使用,那么你这个jar包中的Bean,能被第三方加载么?
本篇博文将主要介绍AutoConfig相关的内容,即如果我想提供一个jar包供第三方在Spring的环境下使用时,可以怎么做
<!-- more -->
通常来讲,要想实现上面的场景,建议是借助@Configuration
注解的配置类来管理你自己的bean,这样对于其他使用方而言,只需要加载到你的配置类,就可以注册你的所有bean了
首先是在你的工程中定义一个配置类,如下
@Configuration
@ComponentScan("com.git.hui.boot.autoconfig")
public class SelfAutoConfig {
}
这个配置类功能比较简单,指明扫描的包路径,然后这个配置类如何给使用方使用呢?
将配置放在指定的文件中即可,使用者会自动加载,从而避免的代码的侵入
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.git.hui.boot.autoconfig.SelfAutoConfig
说明,如果需要换行时,可以如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.git.hui.boot.autoconfig.SelfAutoConfig,`
com.git.hui.boot.autoconfig.SelfAutoConfig2,`
然后使用方就可以愉快的使用你的bean了,定义一个测试的Bean如下
@Slf4j
@Component
public class AutoBean {
private String name;
public AutoBean() {
this("defaultAutoBean");
}
public AutoBean(String name) {
this.name = name;
log.info("AutoBean load time: {}", System.currentTimeMillis());
}
public String getName() {
return name;
}
}
直接在Config配置中,定义Bean,可以说是更加常见的方式,特别是当你的bean不是那么多的时候,推荐使用这种方式,便于集中管理
@Slf4j
public class AutoConfBean {
private String name;
public AutoConfBean(String name) {
this.name = name;
log.info("AutoConfBean load time: {}", System.currentTimeMillis());
}
public String getName() {
return name;
}
}
对应的配置类
@Configuration
@ComponentScan("com.git.hui.boot.autoconfig")
public class SelfAutoConfig {
@Bean
public AutoConfBean autoConfBean() {
return new AutoConfBean("auto load + " + System.currentTimeMillis());
}
}
在新工程中,测试前面的工程的bean,看是否可以正常加载,这一小结结合源码运行查看,更有助于理解
源码工程说明
测试代码如下,已删除无关的内容
@RestController
public class DemoController {
/**
* 测试引入第三方包的情况
*/
@Autowired
private AutoBean autoBean;
@Autowired
private AutoConfBean autoConfBean;
@GetMapping(path = "/show")
public String show(String name) {
Map<String, String> map = new HashMap<>(4);
// ...
map.put("auto", autoBean != null ? autoBean.getName() : "null");
map.put("autoConf", autoConfBean != null ? autoConfBean.getName() : "null");
return JSON.toJSONString(map);
}
}
演示图如下:
本篇的内容比较简单,东西也不多,主要就是在自己的项目中添加一个Configuration
配置类,然后在资源目录下新增 META-INF/spring.factories
即可
上面这么做,其实和Java本身的SPI机制有点像,都是讲一些类信息写在约定的文件中,然后由框架层来获取文件中的内容然后进行解析,后面在源码篇,会涉及到整个处理流程;现在知道大致是这么玩的就行
从简单的使用来讲,上面可以满足一般场景,但是实际的应用中,还有其他的问题
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
一灰灰blog
知识星球
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。