Spring中Lookup注解的使用

18 篇文章 0 订阅

我们知道在spring容器中单独的一个抽象类是不能成为一个bean的,那么有没有办法呢?这个时候我们可以使用Lookup注解,我们可以看下spring的扫描bean部分逻辑。我们知道在spring中要想成为一个bean,必须先生成BeanDefinition对象,如果一个抽象类中没有含有Lookup注解的方法,在spring扫描时就会被排除掉。

	/**
	 * 1、判断是不是独立的类,非静态内部类则无法生成bean,
	 * 2、判断是不是接口或者抽象类(有一种特殊情况),是则无法生成
	 * 3、判断如果是抽象类,但是里面有某个方法上面加油@lookup注解,则也可以生成bean
	 * Determine whether the given bean definition qualifies as candidate.
	 * <p>The default implementation checks whether the class is not an interface
	 * and not dependent on an enclosing class.
	 * <p>Can be overridden in subclasses.
	 * @param beanDefinition the bean definition to check
	 * @return whether the bean definition qualifies as a candidate component
	 */
	protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
		AnnotationMetadata metadata = beanDefinition.getMetadata();
		return (metadata.isIndependent() && (metadata.isConcrete() ||
				(metadata.isAbstract() && metadata.hasAnnotatedMethods(Lookup.class.getName()))));
	}

下面我们就验证下,不使用Lookup注解的情况

@Component
public abstract class C1 {

}

运行结果报错

 在抽象类中随便写个方法,然后方法上面增加Lookup注解

@Component
public abstract class C1 {

    @Lookup
    public void a(){}
}

运行结果,正常输出,通过cglib代理生成新的类

 但是一般很少这样用,另外一种场景可能会用到。在某个单例bean中使用另外一个bean对象,但是每次又想返回的对象不同。但是spring在容器中注入bean的时候,scope默认的是单例模式,也就是说在整个应用中只能创建一个实例。当scope为PROTOTYPE类型的时候,在每次注入的时候会自动创建一个新的bean实例。但是当一个单例模式的bean去引用PROTOTYPE类型的bean的时候,PROTOTYPE类型的bean也会变成单例。

@Component
public class D3 {

    @Autowired
    private E4 e4;

    public void a(){
        System.out.println(this.e4);
    }
}

@Component
public class E4 {
}

输出结果,可以看到每次打印出来的对象是同一个 

使用Lookup注解

@Component
public class D3 {

    public void a(){
        System.out.println(this.a1());
    }

    @Lookup
    public E4 a1(){
        return null;
    }
}

运行输出结果,每次输出的结果已经不相同了,已经达到了我们的需求

这是什么原因导致的呢?还有就是我们a1方法返回的是空,但是输出的结果为啥也有值呢?
因为spring在遇到这种标有Lookup注解的方法时,会生成代理类,重写该方法,然后返回结果,所以我们自己定义的方法不管有没有返回值已经没关系了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值