Spring之@Lookup注解详细解析

 更新时间:2024年01月24日 11:03:39   作者:爱上口袋的天空  
这篇文章主要介绍了Spring之@Lookup注解详细解析,当采用@Autowired注解对单例bean注依赖的原型bean时,会由于单例bean只会创建一次,导致依赖的原型bean也只会注入一次,@Lookup注解可以较为优雅的解决此类问题,需要的朋友可以参考下

1、简介

假设一个单例的Bean A需要引用一个非单例模式的Bean B,那么在每次引用B的时候都想拿到一个新的B,该怎么做?

要知道,Bean A是单例模式的,只会被创建一次,注入一次属性,也就是说,即使B是property模式,那也是只会一个相同的B,因为A只会被注入一次。

2、解决办法

  • 让bean A通过实现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+"次调用的结果:"
                singleton.getObjectId();
            }
    }
}

Spock测试结果:

第0次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第1次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第2次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第3次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第4次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第5次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第6次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第7次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第8次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton@b8e246c, Prototype Object Id : com.talframework.spring.LookupTestPrototype@1f387978
第9次调用的结果:
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());
    }
 
}

调用的结果如下:

第0次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@661c46bc
第1次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@37864b77
第2次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@2b98b3bb
第3次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@540b0448
第4次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@50a691d3
第5次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@557eb543
第6次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@3b95d13c
第7次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@3730ab42
第8次调用的结果:
Singleton Object Id:com.talframework.spring.LookupTestSingleton$$EnhancerBySpringCGLIB$$15adeab8@3be4fcc0, Prototype Object Id : com.talframework.spring.LookupTestPrototype@537c8c7e
第9次调用的结果:

需要注意的是@Lookup只能注解在方法上,这个时候可以注解在一个抽象方法上。

到此这篇关于Spring之@Lookup注解详细解析的文章就介绍到这了,更多相关@Lookup注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux部署springboot项目彩色日志打印方式

    Linux部署springboot项目彩色日志打印方式

    这篇文章主要介绍了Linux部署springboot项目彩色日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java HashMap中除了死循环之外的那些问题

    Java HashMap中除了死循环之外的那些问题

    这篇文章主要介绍了Java HashMap中除了死循环之外的那些问题,这些问题大致可以分为两类,程序问题和业务问题,下面文章我们一个一个来看,需要的小伙伴可以参考一下
    2022-05-05
  • Springboot整合fastdfs实现分布式文件存储

    Springboot整合fastdfs实现分布式文件存储

    本文主要介绍了Springboot整合fastdfs实现分布式文件存储,详细阐述了Springboot应用程序如何与FastDFS进行集成及演示了如何使用Springboot和FastDFS实现分布式文件存储,感兴趣的可以了解一下
    2023-08-08
  • JAVA中使用双括号来初始化静态常量的小技巧

    JAVA中使用双括号来初始化静态常量的小技巧

    这篇文章主要介绍了JAVA中使用双括号来初始化静态常量的小技巧,需要的朋友可以参考下
    2014-06-06
  • Spring Boot监听Redis Key失效事件实现定时任务的示例

    Spring Boot监听Redis Key失效事件实现定时任务的示例

    这篇文章主要介绍了Spring Boot监听Redis Key失效事件实现定时任务的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • springcloud本地服务不注册到注册中心的解决方案

    springcloud本地服务不注册到注册中心的解决方案

    这篇文章主要介绍了springcloud本地服务不注册到注册中心,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • SpringBoot项目找不到javax.servlet.Filter的问题及解决

    SpringBoot项目找不到javax.servlet.Filter的问题及解决

    这篇文章主要介绍了SpringBoot项目找不到javax.servlet.Filter的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java PTA 计算3到7位 水仙花数实例

    Java PTA 计算3到7位 水仙花数实例

    这篇文章主要介绍了Java PTA 计算3到7位 水仙花数实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java语言之包和继承详解

    Java语言之包和继承详解

    这篇文章主要介绍了java的包和继承,结合实例形式详细分析了Java继承的概念、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2021-09-09
  • Java判断两个日期相差天数的方法

    Java判断两个日期相差天数的方法

    这篇文章主要介绍了Java判断两个日期相差天数的方法,以实例形式对比分析了java进行日期换算及对比的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10

最新评论