Updated at 2020-12-17 14:45

找到了个方法——用于替换Spring容器中的Bean

效果是不改变Bean本身,也不改变Bean的调用方

public interface SomeService {
    int doSth();
}
public class SomeServiceImpl implements SomeService {
    @Override
    public int doSth() {
        log.info("original");
        return 1;
    }
}

当没办法修改SomeServiceImpl(比如这个类在别人负责的项目中)

也不希望修改@Autowired了SomeService的Bean时(因为不希望改动到后者内部的逻辑)

可以利用@Primary结合继承的方式来替换

@Primary
@Component
public class SomeServiceImplEx extends SomeServiceImpl {

    @Override
    public int doSth() { // 修饰或是直接重写
        log.info("last");
        int superResult = super.doSth(); 
        return -superResult; 
    }

}

SomeServiceImplEx没有影响到Bean本身以及Bean的调用方

而且只要把SomeServiceImplEx删除,或是去掉它的@Component注解,替换行为就会消失

实现了解耦


Java      Spring