Spring中@Autowired的神奇操作

今天在看Spring中ProviderManager创建过程的源码时,调试到org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration类里的setGlobalAuthenticationConfigurers()方法:

@Autowired(required = false)
public void setGlobalAuthenticationConfigurers(List<GlobalAuthenticationConfigurerAdapter> configurers) {
	configurers.sort(AnnotationAwareOrderComparator.INSTANCE);
	this.globalAuthConfigurers = configurers;
}

虽然知道@Autowired这个注解会自动填入参数,但是在类文件里找了一遍,没有发现List<GlobalAuthenticationConfigurerAdapter>类型的Bean。
后来查了资料才发现,这个类里有3个继承于GlobalAuthenticationConfigurerAdapter类的子类的Bean。

@Bean
public static GlobalAuthenticationConfigurerAdapter enableGlobalAuthenticationAutowiredConfigurer(
		ApplicationContext context) {
	return new EnableGlobalAuthenticationAutowiredConfigurer(context);
}

@Bean
public static InitializeUserDetailsBeanManagerConfigurer initializeUserDetailsBeanManagerConfigurer(
		ApplicationContext context) {
	return new InitializeUserDetailsBeanManagerConfigurer(context);
}

@Bean
public static InitializeAuthenticationProviderBeanManagerConfigurer initializeAuthenticationProviderBeanManagerConfigurer(
		ApplicationContext context) {
	return new InitializeAuthenticationProviderBeanManagerConfigurer(context);
}

这三个类的Bean实例,刚好是上面那个方法里的List类型参数的集合内容。由此猜测,@Autowired会查询到List<T>所对应的T类型Bean,并全部添加到这个List中,再作为参数填入。
于是,写了个测试类验证了一下。

@Configuration
public class SecurityConfig {
	@Bean
    public static AbstractXXX xxx1(){
        return new AbstractXXX();
    }

    @Bean
    public static AbstractXXX xxx2(){
        return new AbstractXXX();
    }

    @Autowired
    public void setConfigurers(List<AbstractXXX> configurers) {
    	System.out.println(configurers.size());
        configurers.sort(AnnotationAwareOrderComparator.INSTANCE);
    }

    public static class AbstractXXX{

    }
}

注释:
@Bean需要@Configuration的配合才能生效
@Bean注解的方法加上static可以确保优先生成,避免"The dependencies of some of the beans in the application context form a cycle"(依赖循环错误)
@Bean注解的方法可以在其它类,只要是被Spring容器托管的Bean对象就行。
自定义类AbstractXXX一样可以在其它类或当独文件,在同一个类中就需要static关键字标识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣广泛的程序猿

有钱的捧个钱场,谢谢各位!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值