Estou curioso para saber como a injeção de mola lida com métodos de chamada com a @Bean
anotação. Se eu colocar uma @Bean
anotação em um método e retornar uma instância, entendo que isso diz ao spring para criar um bean chamando o método e obtendo a instância retornada. No entanto, às vezes esse bean precisa ser usado para conectar outros beans ou configurar outro código. A maneira usual de fazer isso é chamar o @Bean
método anotado para obter uma instância. Minha pergunta é: por que isso não faz com que haja várias instâncias do bean flutuando?
Por exemplo, veja o código abaixo (retirado de outra questão). O entryPoint()
método é anotado com @Bean
, então eu imagino que o spring criará uma nova instância de BasicAuthenticationEntryPoint
as a bean. Em seguida, chamamos entryPoint()
novamente no bloco configure, mas parece que entryPoint()
retorna a instância do bean e não é chamado várias vezes (tentei fazer o log e só consegui uma entrada de log). Potencialmente, poderíamos chamar entryPoint()
várias vezes em outras partes da configuração e sempre obteríamos a mesma instância. Meu entendimento disso está correto? Spring faz alguma reescrita mágica de métodos anotados @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();
}
@Bean
e@Primary
).CGLib allows us to create proxy classes at runtime by creating sub class of specified class using Byte code generation. CGLib proxies are used in the case where Proxy is to be created for those class which does not have any interfaces or have methods which are not declared in the implementing interface.
Neste caso, CGLIB cria uma subclasse da classe @Configuration e sobrescreve seus métodos (incluindo o método @Bean). Portanto, quando chamamos o método @Bean de outro método, na verdade chamamos sua versão substituída (graças à vinculação dinâmica de java).@Component
funcionará se eu usar o CHLIB para criar proxies em vez de java Poxy?