背景,如果有一個類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(); //一般都是抽象方法 }