Spring中Lookup注解怎么用
Spring中Lookup注解怎么用
这篇文章主要介绍了Spring中Lookup注解怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
我们知道在spring容器中单独的一个抽象类是不能成为一个bean的,那么有没有办法呢?这个时候我们可以使用Lookup注解,我们可以看下spring的扫描bean部分逻辑。我们知道在spring中要想成为一个bean,必须先生成BeanDefinition对象,如果一个抽象类中没有含有Lookup注解的方法,在spring扫描时就会被排除掉。
/***1、判断是不是独立的类,非静态内部类则无法生成bean,*2、判断是不是接口或者抽象类(有一种特殊情况),是则无法生成*3、判断如果是抽象类,但是里面有某个方法上面加油@lookup注解,则也可以生成bean*Determinewhetherthegivenbeandefinitionqualifiesascandidate.*<p>Thedefaultimplementationcheckswhethertheclassisnotaninterface*andnotdependentonanenclosingclass.*<p>Canbeoverriddeninsubclasses.*@parambeanDefinitionthebeandefinitiontocheck*@returnwhetherthebeandefinitionqualifiesasacandidatecomponent*/protectedbooleanisCandidateComponent(AnnotatedBeanDefinitionbeanDefinition){AnnotationMetadatametadata=beanDefinition.getMetadata();return(metadata.isIndependent()&&(metadata.isConcrete()||(metadata.isAbstract()&&metadata.hasAnnotatedMethods(Lookup.class.getName()))));}
下面我们就验证下,不使用Lookup注解的情况
@ComponentpublicabstractclassC1{}
运行结果报错
在抽象类中随便写个方法,然后方法上面增加Lookup注解
@ComponentpublicabstractclassC1{@Lookuppublicvoida(){}}
运行结果,正常输出,通过cglib代理生成新的类
但是一般很少这样用,另外一种场景可能会用到。在某个单例bean中使用另外一个bean对象,但是每次又想返回的对象不同。但是spring在容器中注入bean的时候,scope默认的是单例模式,也就是说在整个应用中只能创建一个实例。当scope为PROTOTYPE类型的时候,在每次注入的时候会自动创建一个新的bean实例。但是当一个单例模式的bean去引用PROTOTYPE类型的bean的时候,PROTOTYPE类型的bean也会变成单例。
@ComponentpublicclassD3{@AutowiredprivateE4e4;publicvoida(){System.out.println(this.e4);}}@ComponentpublicclassE4{}
输出结果,可以看到每次打印出来的对象是同一个
使用Lookup注解
@ComponentpublicclassD3{publicvoida(){System.out.println(this.a1());}@LookuppublicE4a1(){returnnull;}}
运行输出结果,每次输出的结果已经不相同了,已经达到了我们的需求
这是什么原因导致的呢?还有就是我们a1方法返回的是空,但是输出的结果为啥也有值呢?
因为spring在遇到这种标有Lookup注解的方法时,会重写该方法,然后返回结果,所以我们自己定义的方法不管有没有返回值已经没关系了。
感谢你能够认真阅读完这篇文章,希望小编分享的“Spring中Lookup注解怎么用”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!
推荐阅读
-
spring(boot 自定义jar包 linux怎么部署springboot)
linux怎么部署springboot?Linux以两种部署springboot项目。部署jar包(官方推荐)在linux服务器上...
-
springboot静态资源路径虚拟映射(spring boot 中可以存放静态滋源文件的位置有)
springboot中可以存放静态滋源文件的位置有?springboot是实际不自动配置来实现的,其中静态资源配置共有是::/...
-
Spring Security 实战干货:手把手教你实现JWT Token
-
「web安全」Spring Boot eureka xstream 反序列化
-
spring中的特殊注解@RequiredArgsConstructor怎么用
spring中的特殊注解@RequiredArgsConstructor怎么用...
-
SpringBoot+Spring Security无法实现跨域怎么解决
-
Spring Security基于注解的接口角色访问控制怎么实现
-
Spring代理对象导致的获取不到原生对象注解怎么解决
Spring代理对象导致的获取不到原生对象注解怎么解决本文小编为大...
-
解析Spring漏洞及修复的方法
-
Spring和IDEA为什么都不推荐使用@Autowired注解