最佳答案
我很好奇 Spring 注入是如何使用 @Bean
注释处理调用方法的。如果我在一个方法上放入一个 @Bean
注释,并返回一个实例,我理解这会通过调用该方法并获取返回的实例来告诉 spring 创建一个 bean。但是,有时必须使用该 bean 连接其他 bean 或设置其他代码。通常的方法是调用 @Bean
注释方法来获得一个实例。我的问题是,为什么这不会导致 bean 的多个实例到处漂浮呢?
例如,请参阅下面的代码(摘自另一个问题)。entryPoint()
方法使用 @Bean
进行注释,因此我想 Spring 将创建一个新的 BasicAuthenticationEntryPoint
实例作为 bean。然后,我们在 configure 块中再次调用 entryPoint()
,但似乎 entryPoint()
返回了 bean 实例,而且没有被多次调用(我尝试了日志记录,但只得到了一个日志条目)。可能我们可以在配置的其他部分多次调用 entryPoint()
,并且总是得到相同的实例。我的理解正确吗?Spring 是否对用 @Bean
注释的方法进行了一些神奇的重写?
@Bean
public BasicAuthenticationEntryPoint entryPoint() {
BasicAuthenticationEntryPoint basicAuthEntryPoint = new BasicAuthenticationEntryPoint();
basicAuthEntryPoint.setRealmName("My Realm");
return basicAuthEntryPoint;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.exceptionHandling()
.authenticationEntryPoint(entryPoint())
.and()
.authorizeUrls()
.anyRequest().authenticated()
.and()
.httpBasic();
}