目录
场景
方法1 直接在自己工程中建同包同类名的类进行替换
方法2 采用@Primary注解
方法3 排除需要替换的jar包中的类
方法4 @Bean 覆盖
方法5 使用BeanDefinitionRegistryPostProcessor
场景
什么情况下要覆写原有的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) {
// 覆写该方法的业务逻辑
t