Spring implementa acesso a objetos Bean de forma mais simples (usando anotações para armazenar e injetar objetos Bean)

Índice

I. Introdução: 

Segundo, armazene o objeto Bean

5 categorias de anotações

Anotação do método @Bean

3. Obtenha o objeto Bean

injeção de atributos

Vantagens e desvantagens 

Injeção de setter

Análise de vantagens e desvantagens 

injeção de construtor

 Análise de vantagens e desvantagens

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


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 implementar

1. @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:

  1. Injeção em Campo;
  2. Injeção Setter;
  3. 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:

  1. Problemas funcionais: não é possível injetar um objeto imutável (objeto final modificado - não pode ser inicializado);
  2. Problema de universalidade: adequado apenas para contêiner IoC;
  3. 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:

  1. Objetos imutáveis ​​não podem ser injetados (objetos finalmente modificados - não podem ser inicializados através do construtor);
  2. 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:

  1. Objetos imutáveis ​​injetáveis ​​(inicializados no construtor);
  2. O objeto injetado não será modificado (em uma classe o construtor só pode ser chamado uma vez);
  3. O objeto injetado será totalmente inicializado;
  4. É 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:

Acho que você gosta

Origin blog.csdn.net/weixin_61061381/article/details/127823096
Recomendado
Clasificación