Crie uma @Configuration
classe anotada:
@Configuration
public class MyApplicationContext {
}
Para cada <bean>
tag, crie um método anotado com @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
, precisamos importar sua definição. Ele pode ser definido em um XML e usaremos @ImportResource
:
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
...
}
Se o bean for definido em outra @Configuration
classe, podemos usar a @Import
anotação:
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
Depois de importar outros XMLs ou @Configuration
classes, podemos usar os beans que eles declaram em nosso contexto, declarando um membro privado para a @Configuration
classe da seguinte maneira:
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
Ou use-o diretamente como parâmetro no método que define o bean que depende disso beanFromSomewhereElse
usando @Qualifier
o seguinte:
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
Importar propriedades é muito semelhante a importar bean de outro xml ou @Configuration
classe. Em vez de usar @Qualifier
, usaremos as @Value
propriedades da seguinte maneira:
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
Isso pode ser usado com expressões SpEL também.
Para permitir que o spring trate essas classes como contêineres de feijão, precisamos marcar isso em nosso xml principal, colocando esta tag no contexto:
<context:annotation-config/>
Agora você pode importar @Configuration
classes exatamente da mesma forma que criaria um bean simples:
<bean class="some.package.MyApplicationContext"/>
Existem maneiras de evitar XMLs de primavera completamente, mas elas não estão no escopo desta resposta. Você pode descobrir uma dessas opções na postagem do meu blog, na qual estou baseando minha resposta.
Basicamente, acho esse método de declaração de beans muito mais confortável do que usar XMLs devido a algumas vantagens que vejo:
As desvantagens não são muitas como eu as vejo, mas existem algumas nas quais eu poderia pensar: