spring在容器中注入bean的時候,scope默認的是單例模式,也就是說在整個應用中只能建立一個實例。當scope爲PROTOTYPE類型的時候,在每次注入的時候會自動建立一個新的bean實例。可是當一個單例模式的bean去引用PROTOTYPE類型的bean的時候,PROTOTYPE類型的bean也會變成單例。
@Lookup註解能夠用來解決這個問題spring
當習慣性使用@Resource或者@Autowired注入時:ide
@SpringBootApplication public class DemoApplication implements CommandLineRunner{ public static void main(String[] args) { SpringApplication.run(IOTPluginDemoApplication.class, args); } @Resource private ClassB classB; @Override public void run(String... args) throws Exception { for (int i = 0; i < 5; i++) { classB.method(); } } @Component public class ClassB{ @Resource public ClassA classA; public void method(){ System.out.println("The hashcode is " + classA.hashCode()); } } @Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ClassA{ } }
打印hashcode會發現,此時的ClassA並無去建立新的實例
spa
修改ClassB的代碼代理
@Component public abstract class ClassB{ @Lookup public abstract ClassA getClassA(); public void method(){ ClassA classA = getClassA(); System.out.println("The hashcode is " + classA.hashCode()); } }
打印hashcode:code
此時ClassA每次注入都會建立新的實例了ip
對於@Lookup修飾的方法,有相對應的標準get
<public|protected> [abstract] <return-type> theMethodName(no-arguments);
public|protected要求方法必須是能夠被子類重寫和調用的
abstract可選,若是是抽象方法,CGLIB的動態代理類就會實現這個方法,若是不是抽象方法,就會覆蓋這個方法
return-type是非單例的類型
no-arguments不容許有參數hash