我的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的自动装配有效?
答案 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
}