TL; DR
A anotação @Autowired poupa você da necessidade de fazer a fiação sozinha no arquivo XML (ou de qualquer outra maneira) e apenas descobre o que precisa ser injetado onde e o faz.
Explicação completa
A @Autowiredanotação permite que você pule as configurações em outro lugar do que injetar e apenas faz isso por você. Supondo que seu pacote seja necessário, com.mycompany.moviesvocê deve colocar essa tag no seu XML (arquivo de contexto do aplicativo):
<context:component-scan base-package="com.mycompany.movies" />
Essa tag fará uma verificação automática. Supondo que cada classe que precisa se tornar um bean seja anotada com uma anotação correta, como @Component(para bean simples) ou @Controller(para um controle de servlet) ou @Repository(para DAOclasses) e essas classes estiverem em algum lugar no pacote com.mycompany.movies, o Spring encontrará tudo isso e criará um feijão para cada um. Isso é feito em duas varreduras das classes - na primeira vez, apenas procura por classes que precisam se tornar um bean e mapeia as injeções necessárias e, na segunda varredura, ele injeta os beans. Obviamente, você pode definir seus beans no arquivo XML mais tradicional ou com um @Configuration classe (ou qualquer combinação das três).
A @Autowiredanotação informa ao Spring onde uma injeção precisa ocorrer. Se você o colocar em um método, setMovieFinderele entenderá (pelo prefixo set+ a @Autowiredanotação) que um bean precisa ser injetado. Na segunda varredura, o Spring procura um bean do tipo MovieFindere, se o encontrar, o injeta nesse método. Se encontrar dois desses feijões, você receberá um Exception. Para evitar isso Exception, você pode usar a @Qualifieranotação e dizer qual dos dois beans injetar da seguinte maneira:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
Ou se você preferir declarar os beans em seu XML, seria algo parecido com isto:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
Na @Autowireddeclaração, você também precisa adicionar o @Qualifierpara informar qual dos dois beans coloridos injetar:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Se você não quiser usar duas anotações (the @Autowirede @Qualifier), poderá usá @Resource-las para combinar essas duas:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
O @Resource(você pode ler alguns dados extras sobre isso no primeiro comentário sobre esta resposta) poupa o uso de duas anotações e, em vez disso, usa apenas uma.
Vou apenas adicionar mais dois comentários:
- A boa prática seria usar em
@Injectvez de, @Autowiredporque não é específica da Primavera e faz parte do JSR-330padrão .
- Outra boa prática seria colocar o
@Inject/ @Autowiredem um construtor em vez de em um método. Se você o colocar em um construtor, poderá validar que os beans injetados não são nulos e falham rapidamente ao tentar iniciar o aplicativo e evitar um NullPointerExceptionquando você realmente precisa usá-lo.
Atualização : Para completar a figura, criei uma nova pergunta sobre a @Configurationturma.