Spring在需要的bean之前加载组件

时间:2014-11-14 15:24:02

标签: java spring

我的Spring项目中有一个基于注释的配置类:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Bean(name = "LDAP_TEMPLATE_BEAN")
    public LdapTemplate configLdapTemplate() {
        System.out.println("BEAN LDAP LOADED");
        LdapContextSource lcs = new LdapContextSource();
        lcs.setUrl("ldap://127.0.0.1:33389/");
//      lcs.setUserDn(BASE_DN);
        lcs.setDirObjectFactory(DefaultDirObjectFactory.class);
//      lcs.setAnonymousReadOnly(true);
        lcs.afterPropertiesSet();
        return new LdapTemplate(lcs);
    }

需要定义bean的组件类:

@Component
public class UserRepo {

    @Autowired
    private LdapTemplate ldapTemplate; 

    public UserRepo() {
        System.out.println("UserRepo created");

当我以Spring Boot App启动项目时,UserRepo构造函数的文本显示在控制台输出上bean的文本之前。实际上,变量ldapTemplate为null并且当然会导致异常。

如何在组件实例化之前让bean实例化发生,因此ldapTemplate的自动装配有效?

2 个答案:

答案 0 :(得分:5)

使用@DependsOn注释来控制bean初始化顺序。

答案 1 :(得分:0)

您似乎认为在初始化该对象之前可以将bean注入另一个bean对象。 Spring需要首先实例化你的bean类(调用它的构造函数),然后才能注入任何字段。

一种选择是使用构造函数注入

@Autowired
public UserRepo(LdapTemplate ldapTemplate) {

或将构造函数中的代码移动到@PostConstruct带注释的方法

@PostConstruct
public void init() {
    // will get invoked after all injections
}