Índice
Segundo, armazene o objeto Bean
Análise de vantagens e desvantagens
Análise de vantagens e desvantagens
A diferença entre @Resource e @Autowired
I. Introdução:
No último blog, falamos sobre o processo geral de um projeto Spring Core:
Crie um projeto - "armazene o objeto no contêiner Spring -" retire o objeto Bean do contêiner Spring
Porém, os processos mencionados no artigo anterior ainda são muito complicados. Existe uma maneira mais fácil de obter acesso a objetos?
Claro que existe, vamos dar uma olhada!
Em primeiro lugar, a criação do projeto Spring - não há nada a dizer sobre isto! Basta seguir as etapas em nosso blog anterior.
Mas observe: em comparação com o blog anterior, o arquivo de configuração do spring mudou - para facilitar o armazenamento de objetos Bean (armazenar o objeto no spring)
O arquivo de configuração do Spring alterado
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <content:component-scan base-package="在对象储存中,要扫描的路径"></content:component-scan> </beans>
Segundo, armazene o objeto Bean
Em primeiro lugar, vamos lembrar que implementamos a forma de armazenar objetos Bean.
Quando armazenamos os beans antes, precisávamos adicionar uma linha de conteúdo de registro do bean no spring-config, conforme mostrado na figura a seguir:
Essa forma de depositar Bean não é muito boa!
1. Você precisa adicionar objetos bean manualmente ao arquivo de configuração
. 2. Se houver um problema no arquivo de configuração, não será fácil depurar.
E agora não precisamos adicionar os objetos Bean que queremos armazenar no arquivo de configuração do Spring, um por um. Nós diretamente:
Você acha que é suficiente adicionar o caminho de digitalização ao arquivo de configuração?
Não, você ainda precisa adicionar anotações à classe - durante o processo de nova verificação, apenas as classes anotadas podem ser armazenadas com sucesso na primavera
Isso nos leva à noção de anotações
Existem dois métodos:
1. Use 5 categorias de anotações para implementar1. @Controller [Controlador - controlador]
2. @Service [serviço - serviço]
3. @Repository [repositório - armazém]
4. @Configuration [configuração - configuração/layout]
5. @Component [componente - componente]
através do acima Qualquer uma das cinco categorias de anotações pode armazenar beans no Spring.2. Pela anotação do método @Bean, um bean também pode ser armazenado no Spring.
5 categorias de anotações
Usamos a anotação @Service acima e as outras quatro anotações @Controller e @Repository são iguais.
Suplemento 1:
Como o uso dessas cinco categorias de anotações é tão semelhante, por que elas são divididas em cinco anotações diferentes? Não é bom unificar em uma anotação?
Para responder a esta pergunta, devemos primeiro compreender o conhecimento da engenharia de software
A razão pela qual falo sobre a definição de "camadas de software" é para preparar o caminho para a explicação posterior de "por que existem cinco categorias de anotação"!
vamos ver
Como essas cinco categorias de anotações correspondem a diferentes camadas na camada de software, elas têm funções diferentes a serem implementadas.
Não é difícil entender por que está dividido em cinco categorias de anotações,
Suplemento 2:
Você ainda pode ter uma dúvida: por quê? Nosso Spring deve ter a seguinte configuração?
O que significa se não existe tal configuração? ?
Você pode imaginar:
Em um projeto Spring, nossas aulas podem ser divididas em dois tipos:1. Classes que requerem inversão de controle e classes cujo "ciclo de vida" é entregue ao Spring para gerenciamento. [Por exemplo: UserController]
2. Não há necessidade de armazenar aulas no Spring.
Suponha que temos um projeto de grande escala, e as classes que precisam ser armazenadas no Spring e as classes que não precisam ser armazenadas no Spring são divididas em 50-50.
Isso causará problemas!
Se não descrevermos esta linha de código no diretório raiz,
o Spring irá verificar todas as classes para ver quais delas estão lá.
mas! As classes que precisam ser armazenadas no Spring no projeto representam apenas 50%.
Ou seja: o Spring perderá o dobro do tempo para verificar classes que não precisam ser armazenadas no Spring.
Portanto, para melhorar a eficiência do Spring, você deve especificar o diretório a ser verificado para mim.
Certifique-se de que neste diretório deve haver classes que precisam ser armazenadas no Spring.
Dessa forma, o Spring só precisa escanear as classes no diretório correspondente e pronto!
Anotação do método @Bean
Acima, implementamos o armazenamento simples de objetos Bean no Spring por meio dos cinco principais tipos de anotações e do método Bean. Então, como simplesmente obter o objeto Bean da primavera?
3. Obtenha o objeto Bean
A obtenção de objetos bean também é chamada de montagem de objetos, que consiste em retirar objetos e colocá-los em uma determinada classe, às vezes chamada de injeção de objetos.
A injeção de objeto é, na verdade, DI em nossa injeção de dependência de primavera.
IoC e DI são os dois conceitos mais importantes do Spring, entre os quais IoC (Inversão de Controle) é a ideia de inversão de controle, e DI (Injeção de Dependência) é sua implementação específica (IoC). Então, de quantas maneiras o DI implementa injeção de dependência? Como esses métodos de injeção são diferentes?
Existem três maneiras comuns de implementar injeção de dependência por meio de @Autowired no Spring:
- Injeção em Campo;
- Injeção Setter;
- Injeção de construtor.
injeção de atributos
Portanto, pode-se concluir que:
Ao usar @Autowired para injeção de propriedade
, se o objeto injetado for armazenado no Spring várias vezes, nenhum bean correspondente poderá ser encontrado apenas pelo tipo da propriedade! É necessário alterar o nome da variável do atributo para BeanName, encontrar o objeto correspondente (bean) de acordo com o BeanName e realizar a injeção do atributo.
Existem mais de um método, mas o método de “descrever com precisão o nome do bean” mencionado acima é o mais simples e eficiente!Não é muito simples, você não precisa obter o objeto de contexto do Spring e o método getBean, você pode obter o bean correspondente diretamente por meio de uma anotação (retirar o bean do Spring).
Vejamos outro exemplo
Quando há vários beans do mesmo tipo, podem ocorrer exceções de bean não exclusivos.
Então, como podemos resolver esse problema?
Dois caminhos:
1. Altere o nome do seu atributo para o nome do método student1 ou student2 na classe
2. Use @Qualifier para filtrar beans
Vantagens e desvantagens
vantagem:
A maior vantagem da injeção de atributos é que ela é simples de implementar e fácil de usar . Você só precisa adicionar uma anotação (@Autowired) à variável e pode obter diretamente o objeto injetado sem novos objetos (esta é a função e charme de DI.)
deficiência:
- Problemas funcionais: não é possível injetar um objeto imutável (objeto final modificado - não pode ser inicializado);
- Problema de universalidade: adequado apenas para contêiner IoC;
- Problema do princípio de design: É mais fácil violar o princípio de design único (devido à conveniência de uso, a injeção de propriedades pode ser usada extensivamente no programa).
Injeção de setter
Análise de vantagens e desvantagens
Como pode ser visto no código acima, a injeção de Setter é muito mais problemática do que a injeção de propriedade .
vantagem:
Se houver alguma vantagem na injeção de Setter, a primeira coisa a sofrer é que ela cumpre totalmente o princípio de design de responsabilidade única, porque cada Setter tem como alvo apenas um objeto .
deficiência:
Mas as suas deficiências também são óbvias, e as suas deficiências reflectem-se principalmente nos dois pontos seguintes:
- Objetos imutáveis não podem ser injetados (objetos finalmente modificados - não podem ser inicializados através do construtor);
- O objeto injetado pode ser modificado (o método setter pode ser chamado várias vezes)
injeção de construtor
Análise de vantagens e desvantagens
vantagem:
Em comparação com os dois métodos de injeção anteriores, a injeção de construtor pode injetar objetos imutáveis, e só será executada uma vez, e não existe injeção de setter onde o objeto injetado é modificado a qualquer momento. Suas vantagens são as seguintes: individual:
- Objetos imutáveis injetáveis (inicializados no construtor);
- O objeto injetado não será modificado (em uma classe o construtor só pode ser chamado uma vez);
- O objeto injetado será totalmente inicializado;
- É mais versátil (ou seja, pode ser usado tanto para contêineres IoC quanto para contêineres não IoC).
deficiência:
Como vários parâmetros podem ser passados no método de construção, é fácil violar o princípio da unicidade
Perguntas clássicas de entrevista: Qual é a diferença entre injeção de propriedade, injeção de construtor e injeção de Setter?
A diferença entre @Resource e @Autowired
@Autowired é a anotação fornecida pelo Spring, @Resource é a anotação fornecida pelo jdk
1. Uso diferente
- @Autowired, suporta injeção de propriedade, injeção de construtor e injeção de método Setter.
- @Resource: Suporta injeção de propriedade e injeção de método Setter. A injeção de construtor não é suportada.
2. A injeção de atributos de @Resource é mais confortável de usar do que a injeção de atributos de @Autowired. Porque @Resource tem muitas propriedades que podem ser definidas; enquanto @Autowired tem apenas uma propriedade de valor.
Existem muitos atributos, o que significa que muitas outras funções podem ser usadas.
Por exemplo, quando existem vários beans do mesmo tipo acima, pode haver exceções de beans não exclusivos.Se for @Autowired, também precisaremos de um @Qualifier adicional para filtrar e mesclar beans.
E @Resource pode diretamente: