Spring中的@Lookup註解

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並無去建立新的實例
clipboard.pngspa

修改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

clipboard.png

此時ClassA每次注入都會建立新的實例了ip

對於@Lookup修飾的方法,有相對應的標準get

<public|protected> [abstract] <return-type> theMethodName(no-arguments);

public|protected要求方法必須是能夠被子類重寫和調用的
abstract可選,若是是抽象方法,CGLIB的動態代理類就會實現這個方法,若是不是抽象方法,就會覆蓋這個方法
return-type是非單例的類型
no-arguments不容許有參數hash

相關文章
相關標籤/搜索