当前位置:网站首页>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;
}边栏推荐
- Name of institution approved in advance
- 愛可可AI前沿推介(7.2)
- Pyobject to char* (string)
- Digital collection system development (program development) - Digital Collection 3D modeling economic model system development source code
- Demo of converting point cloud coordinates to world coordinates
- Pattern matching extraction of specific subgraphs in graphx graph Computing Practice
- Experiment collection of University "Fundamentals of circuit analysis". Experiment 6 - observation and measurement of typical signals
- SQL FOREIGN KEY
- Review materials for the special topic of analog electronics with all essence: basic amplification circuit knowledge points
- /Bin/ld: cannot find -llz4
猜你喜欢
![[leetcode] 1162 map analysis](/img/9a/d04bde0417d4d5232950a4e260eb91.png)
[leetcode] 1162 map analysis

可视化技术在 Nebula Graph 中的应用
![[leetcode] 417 - Pacific Atlantic current problem](/img/30/c541bc1e81eb4e348ca11116a05e84.png)
[leetcode] 417 - Pacific Atlantic current problem

已知两种遍历序列构造二叉树

Postgressql stream replication active / standby switchover primary database no read / write downtime scenario

Experiment collection of University "Fundamentals of circuit analysis". Experiment 7 - Research on sinusoidal steady-state circuit

Ant group's large-scale map computing system tugraph passed the national evaluation

愛可可AI前沿推介(7.2)
![[salesforce] how to confirm your salesforce version?](/img/ce/4c844b1b686397faa1b6aa3d57e034.png)
[salesforce] how to confirm your salesforce version?

Experiment collection of University "Fundamentals of circuit analysis". Experiment 6 - observation and measurement of typical signals
随机推荐
Digital collection system development (program development) - Digital Collection 3D modeling economic model system development source code
/Bin/ld: cannot find -lgssapi_ krb5
Jsp+mysql006 community management system
Introduction to Dynamic Planning II (5.647.62)
6096. 咒语和药水的成功对数
图数据库|Nebula Graph v3.1.0 性能报告
Moveit 避障路径规划 demo
全是精华的模电专题复习资料:基本放大电路知识点
【小白聊云】中小企业容器化改造建议
Aiko ai Frontier promotion (7.2)
动态规划入门二(5.647.62)
【LeetCode】1905-统计子岛屿
Wavedec2 in MATLAB, talk about the wavedec2 function [easy to understand]
Floyed "suggestions collection"
College entrance examination admission score line climbing
[leetcode] 19 delete the penultimate node of the linked list
数组和链表的区别浅析
已知两种遍历序列构造二叉树
Add an empty column to spark dataframe - add an empty column to spark dataframe
PostgresSQL 流复制 主备切换 主库无读写宕机场景