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 @Autowired
anotaçã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.movies
você 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 DAO
classes) 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 @Autowired
anotação informa ao Spring onde uma injeção precisa ocorrer. Se você o colocar em um método, setMovieFinder
ele entenderá (pelo prefixo set
+ a @Autowired
anotação) que um bean precisa ser injetado. Na segunda varredura, o Spring procura um bean do tipo MovieFinder
e, 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 @Qualifier
anotaçã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 @Autowired
declaração, você também precisa adicionar o @Qualifier
para 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 @Autowired
e @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
@Inject
vez de, @Autowired
porque não é específica da Primavera e faz parte do JSR-330
padrão .
- Outra boa prática seria colocar o
@Inject
/ @Autowired
em 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 NullPointerException
quando você realmente precisa usá-lo.
Atualização : Para completar a figura, criei uma nova pergunta sobre a @Configuration
turma.