当前位置:网站首页>Boot 中bean配置覆盖
Boot 中bean配置覆盖
2022-07-02 12:28:00 【lvhui321】
问题:
项目引用第三方jar包,需要对@Configuration配置类中的某个bean进行覆盖。服务启动过程遇到了bean已被注册异常、新加的bean不加载的问题。
举例:
第三方jar包MybatisPlusConfig 类
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor innerInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //分页 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //乐观锁 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(this.tenantLineHandler())); interceptor.addInnerInterceptor(new SystemLineInnerInterceptor(this.systemLineHandler())); return interceptor; }}
当前项目MybatisPrimaryConfig 类
public class MybatisPrimaryConfig { @Bean public MybatisPlusInterceptor innerInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //分页 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //乐观锁 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new SystemLineInnerInterceptor(this.systemLineHandler())); return interceptor; }}
1.思路是MybatisPrimaryConfig类的方法bean名字innerInterceptor覆盖MybatisPlusConfig类的方法bean名字innerInterceptor
2.步骤是在springboot中,allowBeanDefinitionOverriding 默认为false;spring默认为true。需要在application.properties中新增spring.main.allow-bean-definition-overriding=true。
3. bean加载顺序
配置allowBeanDefinitionOverriding为true后,却出现新配置不注册的问题。@SpringBootApplication的属性scanBasePackages数组,注册bean时,是按数组顺序注册的。把引用包的包名写在项目包名前面,项目中的配置类才可覆盖掉引用包的bean。@SpringBootApplication(scanBasePackages={"com.qm.qfc.common.entity.config","com.qm.qfc.dpf.dpfservice"})
1.spring中的org.springframework.context.annotation.ComponentScanAnnotationParser包扫描代码
public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, final String declaringClass) {
....
Set<String> basePackages = new LinkedHashSet();
String[] basePackagesArray = componentScan.getStringArray("basePackages");
String[] var19 = basePackagesArray;
int var21 = basePackagesArray.length;
int var22;
for(var22 = 0; var22 < var21; ++var22) {
String pkg = var19[var22];
String[] tokenized = StringUtils.tokenizeToStringArray(this.environment.resolvePlaceholders(pkg), ",; \t\n");
Collections.addAll(basePackages, tokenized);
}
Class[] var20 = componentScan.getClassArray("basePackageClasses");
var21 = var20.length;
for(var22 = 0; var22 < var21; ++var22) {
Class<?> clazz = var20[var22];
basePackages.add(ClassUtils.getPackageName(clazz));
}
if (basePackages.isEmpty()) {
basePackages.add(ClassUtils.getPackageName(declaringClass));
}
scanner.addExcludeFilter(new AbstractTypeHierarchyTraversingFilter(false, false) {
protected boolean matchClassName(String className) {
return declaringClass.equals(className);
}
});
return scanner.doScan(StringUtils.toStringArray(basePackages));
}
2.在方法1中查看doScan方法是在org.springframework.context.annotation.ClassPathBeanDefinitionScanner类
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
//依次对basePackages中配置的类进行注入
for (String basePackage : basePackages) {
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
...
}
return beanDefinitions;
}边栏推荐
- lseek 出错
- [leetcode] 417 - Pacific Atlantic current problem
- Name of institution approved in advance
- Solve the problem of base64encoder error
- 【LeetCode】977-有序數組的平方
- Ant group's large-scale map computing system tugraph passed the national evaluation
- Target detection - make your own deep learning target detection data set with labelimg
- [leetcode] 1254 - count the number of closed Islands
- SQL FOREIGN KEY
- Demo of converting point cloud coordinates to world coordinates
猜你喜欢

Application of visualization technology in Nebula graph
![[leetcode] 417 - Pacific Atlantic current problem](/img/30/c541bc1e81eb4e348ca11116a05e84.png)
[leetcode] 417 - Pacific Atlantic current problem

PHP static members

Pattern matching extraction of specific subgraphs in graphx graph Computing Practice

可视化技术在 Nebula Graph 中的应用

(Video + graphic) machine learning introduction series - Chapter 5 machine learning practice

Introduction to Dynamic Planning II (5.647.62)

动态规划入门二(5.647.62)

Xpt2046 four wire resistive touch screen

全是精华的模电专题复习资料:基本放大电路知识点
随机推荐
[leetcode] 1905 statistics sub Island
/Bin/ld: cannot find -lgssapi_ krb5
Thoroughly understand browser strong cache and negotiation cache
2279. Maximum number of backpacks filled with stones
解决BASE64Encoder报错的问题
Comparison between rstan Bayesian regression model and standard linear regression model of R language MCMC
6090. 极大极小游戏
The outline dimension function application of small motherboard
数据库系统概论第一章简答题-期末考得怎么样?
SQL修改语句
[leetcode] 283 move zero
matlab中wavedec2,说说wavedec2函数[通俗易懂]
6095. 强密码检验器 II
奥比中光 astra: Could not open “2bc5/[email protected]/6“: Failed to set USB interface
[development environment] install Visual Studio Ultimate 2013 development environment (download software | install software | run software)
Pyinstaller's method of packaging pictures attached to exe
[leetcode] 977 - carré du tableau ordonné
How to import a billion level offline CSV into Nepal graph
Pyinstaller打包exe附带图片的方法
树-二叉搜索树