bean覆盖 springboot_覆盖重写 原有Spring Bean的几种方式

本文介绍了在SpringBoot中覆盖或重写已有Bean的五种方法:1) 创建同包同类名的类;2) 使用@Primary注解;3) 通过@ComponentScan排除并自定义类;4) 利用@Bean覆盖;5) 使用BeanDefinitionRegistryPostProcessor修改Bean定义。这些方法在处理第三方库中问题或自定义逻辑时非常实用。
摘要由CSDN通过智能技术生成

场景

什么情况下要覆写原有的Spring Bean ? 例如引入的第三方jar包中的某个类有些问题,然有没有源码提供或者嫌编译源码太费事,这个时间可以考虑覆写原有的类。

方法1 直接在自己工程中建同包同类名的类进行替换

方式简单粗暴,可以直接覆盖掉jar包中的类,spring项目会优先加载自定义的类。

下面是覆盖 flowable框架中的一个类 FlowableCookieFilter,主要是想修改它里面的redirectToLogin方法的业务逻辑。包路径为 org.flowable.ui.common.filter, 直接工程里面新建一样路径一样类名FlowableCookieFilter即可。

方法2 采用@Primary注解

该方法适用于接口实现类,自己创建一个原jar包接口的实现类,然后类上加上@Primary注解,spring则默认加载该类实例化出的Bean。

下面的例子: 一个接口 RemoteIdmService,原先jar包中只有一个实现类 RemoteIdmServiceImpl,现在自己工程里面创建一个 CustomRemoteIdmServiceImpl 继承RemoteIdmService接口,然后发现所有调用RemoteIdmService接口里面的方法实际调用走的是CustomRemoteIdmServiceImpl 里面的方法。

方法3 排除需要替换的jar包中的类

使用 @ComponentScan 里面的 excludeFilters 功能排除调用要替换的类,然后自己写个类继承替换的类即可。

下面的例子是替换掉 jar包中的PersistentTokenServiceImpl类

@SpringBootApplication

@ComponentScan(excludeFilters = {@ComponentScan.Filter(type =

FilterType.ASSIGNABLE_TYPE, classes = {PersistentTokenServiceImpl.class})})

public class Application {

public static void main(String[] args) {

new SpringApplication(Test.class).run(args);

}

}

@Service

public class MyPersistentTokenServiceImpl extends PersistentTokenServiceImpl{

@Override

public Token saveAndFlush(Token token) {

// 覆写该方法的业务逻辑

tokenCache.put(token.getId(), token);

idmIdentityService.saveToken(token);

return token;

}

@Override

publi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值