SpringBoot中的自动装配顺序

时间:2018-12-06 12:16:08

标签: spring spring-boot

我希望Spring以给定的顺序注入Bean。我在下面的代码中遇到了一个奇怪的问题。 setAuthenticationProvider()configureAuthManager()方法均以随机顺序注入。如果首先注入configureAuthManager(),则在登录过程中会得到一个NPE。否则,它将运行良好。

所以我想强迫Spring保持秩序。我尝试用setAuthenticationProvider来注释Order(1),而用Order(2)来注释-没帮助(为什么?)。然后,我也尝试使用@DependsOn注释,但是它也不能解决我的问题。

@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    private AuthenticationProvider authenticationProvider;

    // @Order(1) - does not help
    @Autowired
    @Qualifier("daoAuthenticationProvider")
    public void setAuthenticationProvider(AuthenticationProvider authenticationProvider) {
        System.out.println("1");
        this.authenticationProvider = authenticationProvider;
    }

    // @Order(2) - does not help
    // @DependsOn("daoAuthenticationProvider") - does not help either
    @Autowired
    public void configureAuthManager(AuthenticationManagerBuilder authenticationManagerBuilder) {
        System.out.println("2");
        authenticationManagerBuilder.authenticationProvider(authenticationProvider);
    }
    [...]
}

1 个答案:

答案 0 :(得分:0)

bean创建的顺序无关紧要。如果您需要先注入依赖项,则可以调用任何一种方法

  1. 使用基于构造函数的依赖注入
  2. 将参数添加到需要它的方法,并使用@Autowired(如果创建bean,则使用@Bean)。

无论哪种方式,Spring都可以弄清楚创建bean的顺序,以便在正确的时间满足所有依赖性。