Crea una @Configuration
clase anotada:
@Configuration
public class MyApplicationContext {
}
Para cada <bean>
etiqueta, cree un método anotado con @Bean
:
@Configuration
public class MyApplicationContext {
@Bean(name = "someBean")
public SomeClass getSomeClass() {
return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
}
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass() {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
}
}
Para importar beanFromSomewhereElse
, necesitamos importar su definición. Se puede definir en un XML y usaremos @ImportResource
:
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
...
}
Si el bean está definido en otra @Configuration
clase podemos usar la @Import
anotación:
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
Después de importar otros XML o @Configuration
clases, podemos usar los beans que declaran en nuestro contexto al declarar un miembro privado de la @Configuration
clase de la siguiente manera:
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
O utilícelo directamente como parámetro en el método que define el bean que depende de esto beanFromSomewhereElse
usando @Qualifier
lo siguiente:
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
Importar propiedades es muy similar a importar bean de otro xml o @Configuration
clase. En lugar de usar @Qualifier
, usaremos @Value
con propiedades de la siguiente manera:
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
Esto también se puede utilizar con expresiones SpEL .
Para permitir que Spring trate estas clases como contenedores de frijoles, necesitamos marcar esto en nuestro xml principal colocando esta etiqueta en el contexto:
<context:annotation-config/>
Ahora puede importar @Configuration
clases exactamente igual que crearía un bean simple:
<bean class="some.package.MyApplicationContext"/>
Hay formas de evitar los XML de primavera por completo, pero no están en el alcance de esta respuesta. Puede encontrar una de estas opciones en la publicación de mi blog en la que baso mi respuesta.
Básicamente, encuentro este método para declarar beans mucho más cómodo que usar XML debido a algunas ventajas que veo:
Las desventajas no son muchas como las veo, pero hay algunas en las que podría pensar: