场景:
一个单例的Bean A需要依赖原型Bean B,由于A是单例的而引起A中引用的B也出现单例的现象。
解决方法在spring官网https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-method-injection中给出:
解决方法一:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class AService implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void pringB(){
System.out.println(applicationContext.getBean(BService.class).hashCode());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
}
实现ApplicationContextAware 接口,在每一次需要B时在spring容器中重新获取,达到了单例A中依赖原型B时使用场景。
或者不实现ApplicationContextAware 接口而是通过其他方式获取到spring容器,在容器中获取B也可以。
解决方法二:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public abstract class A2Service{
public void pringB(){
System.out.println(createB().hashCode());
}
@Lookup
protected abstract BService createB();
}
使用@Lookup注解,声明抽象类,在spring的生命周期过程中为其生成代理类。
@Lookup注解的另外一种用法:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class A3Service {
public void pringB(){
System.out.println(getbService().hashCode());
}
@Lookup
public BService getbService() {
return null;
}
}