Primeiro, e mais importante - todos os beans Spring são gerenciados - eles "vivem" dentro de um contêiner, chamado "contexto do aplicativo".
Segundo, cada aplicativo tem um ponto de entrada para esse contexto. Os aplicativos da Web têm um Servlet, o JSF usa um el-resolvedor, etc. Além disso, há um local em que o contexto do aplicativo é autoinicializado e todos os beans - com conexão automática. Em aplicativos da web, isso pode ser um ouvinte de inicialização.
A fiação automática ocorre colocando uma instância de um bean no campo desejado em uma instância de outro bean. Ambas as classes devem ser beans, isto é, devem ser definidas para viver no contexto do aplicativo.
O que é "viver" no contexto do aplicativo? Isso significa que o contexto instancia os objetos, não você. Ou seja, você nunca faznew UserServiceImpl()
- o contêiner encontra cada ponto de injeção e define uma instância lá.
Nos seus controladores, você apenas tem o seguinte:
@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {
// Tells the application context to inject an instance of UserService here
@Autowired
private UserService userService;
@RequestMapping("/login")
public void login(@RequestParam("username") String username,
@RequestParam("password") String password) {
// The UserServiceImpl is already injected and you can use it
userService.login(username, password);
}
}
Algumas notas:
- Em sua
applicationContext.xml
você deve habilitar o <context:component-scan>
modo que as aulas são digitalizados para o @Controller
, @Service
, etc. anotações.
- O ponto de entrada para um aplicativo Spring-MVC é o DispatcherServlet, mas está oculto para você e, portanto, a interação direta e a inicialização do contexto do aplicativo acontecem nos bastidores.
UserServiceImpl
também deve ser definido como bean - usando <bean id=".." class="..">
ou usando a @Service
anotação. Uma vez que será o único implementador de UserService
, será injetado.
- Além da
@Autowired
anotação, o Spring pode usar a fiação automática configurável em XML. Nesse caso, todos os campos que possuem um nome ou tipo que corresponde a um bean existente são automaticamente injetados. De fato, essa foi a ideia inicial da fiação automática - ter campos injetados com dependências sem nenhuma configuração. Outras anotações como @Inject
, @Resource
também podem ser usadas.
Depende se você deseja a rota de anotações ou a rota de definição XML do bean.
Digamos que você tenha os beans definidos no seu
applicationContext.xml
:A fiação automática acontece quando o aplicativo é iniciado. Portanto, em
fooController
, que por razões de interesse deseja usar aUserServiceImpl
classe, você deve anotá-la da seguinte maneira:Quando vir
@Autowired
, o Spring procurará uma classe que corresponda à propriedade noapplicationContext
e injetará automaticamente. Se você tiver mais de umUserService
bean, terá que qualificar qual deles deve usar.Se você fizer o seguinte:
Ele não atenderá a
@Autowired
menos que você o configure.fonte
bean id
emapplicationContext.xml
. Teremos que definir auserService
variável com oUserService
tipo Então, por que fazer entrada noxml
arquivo.@Autowired
é uma anotação introduzida na Primavera 2.5 e é usada apenas para injeção.Por exemplo:
fonte
@Autowired
não significa que "você pode usar toda a função (método) e variável naB
classe da classeA
". O que ele faz é trazer uma instância deA
para instâncias deB
, para que você possa fazer aa.getId()
partirB
.Como
@Autowired
funciona internamente?Exemplo:
arquivo .xml será semelhante se não estiver usando
@Autowired
:Se você estiver usando,
@Autowired
então:arquivo .xml será semelhante se não estiver usando
@Autowired
:Se ainda tiver alguma dúvida, veja abaixo a demonstração ao vivo
Como o @Autowired funciona internamente?
fonte
Você só precisa anotar sua classe de serviço
UserServiceImpl
com a anotação:O contêiner de mola cuidará do ciclo de vida desta classe quando se registrar como serviço.
Em seu controlador, você pode conectá-lo automaticamente (instanciar) e usar sua funcionalidade:
fonte
O injetor de dependência do Spring ajuda você a remover o acoplamento de suas classes. Em vez de criar objetos como este:
Você o usará depois de introduzir o DI:
Para conseguir isso, você precisa criar um bean do seu serviço em seu
ServiceConfiguration
arquivo. Depois disso, você precisa importar esseServiceConfiguration
classe para suaWebApplicationConfiguration
classe, para poder conectar automaticamente esse bean ao seu Controller da seguinte maneira:Você pode encontrar um POC baseado em configuração java aqui exemplo .
fonte
Maneira padrão:
Interface de serviço do usuário:
Classe UserServiceImpl:
Resultado:
Example test UserServiceImpl
Esse é um ótimo exemplo de classes acopladas estreitas, exemplo de design incorreto e haverá problemas com os testes (o PowerMockito também é ruim).
Agora, vamos dar uma olhada na injeção de dependência do SpringBoot, um bom exemplo de acoplamento flexível:
A interface permanece a mesma,
Classe principal:
Classe ServiceUserImpl:
Resultado:
Example test UserServiceImpl
e agora é fácil escrever teste:
Eu mostrei
@Autowired
anotação no construtor, mas também pode ser usada no setter ou no campo.fonte
Todo o conceito de inversão de controle significa que você está livre de uma tarefa para instanciar objetos manualmente e fornecer todas as dependências necessárias. Quando você anota uma classe com a anotação apropriada (por exemplo
@Service
), o Spring instancia automaticamente o objeto para você. Se você não estiver familiarizado com anotações, também poderá usar o arquivo XML. No entanto, não é uma má idéia instanciar classes manualmente (com anew
palavra - chave) em testes de unidade quando você não deseja carregar todo o contexto da primavera.fonte
Lembre-se de que você deve ativar a
@Autowired
anotação adicionando elemento<context:annotation-config/>
ao arquivo de configuração da mola. Isso registrará oAutowiredAnnotationBeanPostProcessor
que cuida do processamento da anotação.E então você pode instalar automaticamente seu serviço usando o método de injeção em campo.
Encontrei isso no post da anotação Spring @autowired
fonte
Existem três maneiras de criar uma instância usando
@Autowired
.1.
@Autowired
em PropriedadesA anotação pode ser usada diretamente nas propriedades, eliminando, portanto, a necessidade de getters e setters:
No exemplo acima, o Spring procura e injeta
userService
quandoUserController
é criado.2.
@Autowired
em settersA
@Autowired
anotação pode ser usada nos métodos do setter. No exemplo abaixo, quando a anotação é usada no método setter, o método setter é chamado com a instância deuserService
quandoUserController
é criado:3.
@Autowired
em construtoresA
@Autowired
anotação também pode ser usada em construtores. No exemplo abaixo, quando a anotação é usada em um construtor, uma instância deuserService
é injetada como argumento ao construtor quandoUserController
é criada:fonte
Em palavras simples, a fiação automática, a fiação dos links automaticamente, agora vem a pergunta sobre quem faz isso e que tipo de fiação. A resposta é: O contêiner faz isso e o tipo de fiação secundária é suportado; as primitivas precisam ser feitas manualmente.
Pergunta: Como o contêiner sabe que tipo de fiação?
Resposta: Definimos como byType, byName, construtor.
Pergunta: Existe alguma maneira de não definirmos o tipo de fiação automática?
Resposta: Sim, está lá fazendo uma anotação, @Autowired.
Pergunta: Mas como o sistema sabe, eu preciso escolher esse tipo de dados secundários?
Resposta: Você fornecerá esses dados no arquivo spring.xml ou usando anotações de estereótipo para sua classe, para que o contêiner possa criar os objetos para você.
fonte