Spring之@Lookup注解詳細解析
1、簡介
假設(shè)一個單例的Bean A需要引用一個非單例模式的Bean B,那么在每次引用B的時候都想拿到一個新的B,該怎么做?
要知道,Bean A是單例模式的,只會被創(chuàng)建一次,注入一次屬性,也就是說,即使B是property模式,那也是只會一個相同的B,因為A只會被注入一次。
2、解決辦法
- 讓bean A通過實現(xiàn)ApplicationContextAware來感知applicationContext(即可以獲得容器上下文),從而能在運行時通過ApplicationContext.getBean(String beanName)的方法來獲取最新的bean B
- 使用Spring的Lookup注解
3、案例
原型B
@Component
@Scope(value = "prototype")
public class LookupTestPrototype {
}單例A
@Component
public class LookupTestSingleton {
@Autowired
LookupTestPrototype lookupTestPrototype;
public void getObjectId() {
System.out.println("Singleton Object Id:" + this + ", Prototype Object Id : " + lookupTestPrototype);
}
}Spock測試代碼:
@ContextConfiguration(
classes = [LookupTestSingleton.class, LookupTestPrototype.class]
)
class Spock4SpringTest extends Specification {
@Resource
LookupTestSingleton singleton;
def "測試單例中使用多例的注解" () {
setup:
for (int i = 0; i < 10; i++) {
println "第"+i+"次調(diào)用的結(jié)果:"
singleton.getObjectId();
}
}
}Spock測試結(jié)果:
第0次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第1次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第2次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第3次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第4次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第5次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第6次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第7次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第8次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第9次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
使用@Lookup改動的單例A代碼如下:
@Component
public abstract class LookupTestSingleton {
@Lookup
public abstract LookupTestPrototype lookupTestPrototype ();
public void getObjectId() {
System.out.println("Singleton Object Id:" + this + ", Prototype Object Id : " + lookupTestPrototype());
}
}調(diào)用的結(jié)果如下:
第0次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@661c46bc
第1次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@37864b77
第2次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@2b98b3bb
第3次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@540b0448
第4次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@50a691d3
第5次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@557eb543
第6次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@3b95d13c
第7次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@3730ab42
第8次調(diào)用的結(jié)果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@537c8c7e
第9次調(diào)用的結(jié)果:
需要注意的是@Lookup只能注解在方法上,這個時候可以注解在一個抽象方法上。
到此這篇關(guān)于Spring之@Lookup注解詳細解析的文章就介紹到這了,更多相關(guān)@Lookup注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
NetBeans安裝提示neatbeans cannot find java 1.8 or higher
今天小編就為大家分享一篇關(guān)于NetBeans安裝提示neatbeans cannot find java 1.8 or higher,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
IntelliJ IDEA全局內(nèi)容搜索和替換教程圖解
很多朋友在做項目時,會在整個項目里活指定文件夾下進行全局搜索和替換,下面小編給大家?guī)砹薎ntelliJ IDEA全局內(nèi)容搜索和替換教程圖解,需要的朋友參考下吧2018-04-04
關(guān)于Nacos配置管理的統(tǒng)一配置管理、自動刷新詳解
這篇文章主要介紹了關(guān)于Nacos配置管理的統(tǒng)一配置管理、自動刷新詳解,Nacos是阿里的一個開源產(chǎn)品,是針對微服務(wù)架構(gòu)中的服務(wù)發(fā)現(xiàn)、配置管理、服務(wù)治理的綜合型解決方案,需要的朋友可以參考下2023-05-05
JDBC之PreparedStatement類中預編譯的綜合應(yīng)用解析
SQL 語句被預編譯并存儲在 PreparedStatement 對象中。然后可以使用此對象多次高效地執(zhí)行該語句2013-07-07

