背景,如果有一个类C,需要用到类B,如果使用@Autowired注解注入B,那么B每次调用都是同一个对象,即使B不是单例的,现在我希望每次调用B都是不一样的,那么实现方案有2个:
方案A : 每次从容器中获取B:
@Component @Scope(scopeName= ConfigurableBeanFactory.SCOPE_PROTOTYPE) //原型 也就是非单例 public class B { public void sayHi(){ System.out.println("hi"); } } @Component public class C implements ApplicationContextAware { private ApplicationContext applicationContext; public void hello(){ B b = (B)applicationContext.getBean("b"); b.sayHi(); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext=applicationContext; } }
方案B: 使用@lookup注解:
@Component @Scope(scopeName= ConfigurableBeanFactory.SCOPE_PROTOTYPE) //原型 也就是非单例 public class B { public void sayHi(){ System.out.println("hi"); } } @Component public abstract class C { public void hello(){ B b = getB(); b.sayHi(); } @Lookup public abstract B getB(); //一般都是抽象方法 }