JavaRush /Blogue Java /Random-PT /Primavera. Lição 3. DI usando setter
Umaralikhon
Nível 3
Красноярск

Primavera. Lição 3. DI usando setter

Publicado no grupo Random-PT
E assim... Continuamos o nosso rumo na Primavera. Na última lição aprendemos como injetar dependências usando um construtor de classe. Agora é hora de apresentar outro método de injeção de dependência - usando um setter . Para recuperar a memória das lições anteriores, mostrarei a estrutura do nosso programa. Primavera.  Lição 3. DI usando setter - 1 Estamos interessados ​​apenas nos arquivos HiringDepartment e applicationContext. Eles gerenciam nosso projeto. Vamos refazê-los. Este é o código antigo do arquivo HiringDepartment: (Listagem 1)
package org.example;

public class HiringDepartment {
    private Development development; //Определяем интерфейс

    //Конструктор принимает an object интерфейса
    public HiringDepartment(Development development){
        this.development = development;
    }

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
Como vemos aqui, um construtor é usado para inicializar um objeto do tipo Development. Removemos este construtor (ou deixamos, não faz diferença). E vamos escrever um setter, como no exemplo a seguir: (Listagem 2)
package org.example;

public class HiringDepartment {
    private Development development; //Определяем интерфейс

//Вместо конструктора используем сеттер
    public void setDevelopment(Development development){
        this.development = development;
    }

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
Agora vamos abrir o arquivo applicationContext.xml na pasta de recursos. Fica assim: (Listagem 3)
<?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:context="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
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
    <bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>

    <bean id="hiringDepartment" class="org.example.HiringDepartment">
        <constructor-arg ref="javaDeveloper"/>
    </bean>

</beans>
Como lembramos (ou não lembramos), na linha <constructor-arg ref="javaDeveloper"/> a dependência é injetada usando o construtor. Agora precisamos reescrever esta linha para o setter conforme mostrado abaixo:
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>

<bean id="hiringDepartment" class="org.example.HiringDepartment">
    <property name="development" ref="pythonDeveloper"/> <!--Изменяем только тут-->
</bean>
O que exatamente está acontecendo aqui? A linha <property name="development" ref="pythonDeveloper"/> usa a palavra-chave " property " para injetar a dependência usando um setter. Como o Spring descobriu a qual setter o objeto pythonDeveloper precisa estar associado em nosso exemplo ? Observe o valor property="..." resultante . Está escrito como "desenvolvimento" . E nosso setter no arquivo HiringDepartment é chamado setDevelopment . Spring converte o valor do desenvolvimento em setDevelopment nos bastidores . Ou seja, a primeira letra fica maiúscula e o prefixo set (developmet -> setDevelopment) é colocado no início da palavra. Primavera.  Lição 3. DI usando setter - 2O que há sob o capô? O que vemos: Dois beans são criados com id javaDeveloper e pythonDeveloper:
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>
O que realmente acontece: Spring cria dois objetos do tipo JavaDevelopment e PythonDevelopment:
JavaDevelopment javaDevelopment = new JavaDevelopment();
PythonDevelopment pythonDevelopment = new PythonDevelopment();
E aqui está o que vemos: Um bean com id hireDepartment é criado. Então o id de um dos objetos criados acima é atribuído à propriedade:
<bean id="hiringDepartment" class="org.example.HiringDepartment">
    <property name="development" ref="pythonDeveloper"/>
</bean>
O que realmente acontece: É criado um objeto do tipo HiringDepartment. Em seguida, o método set desta classe setDevelopment(Desenvolvimento de desenvolvimento) é chamado. E o valor ref (id dos objetos criados) é passado como argumento:
HiringDepartment hiringDepartment = new HiringDepartment();
hiringDepartment.setDevelopment(pythonDevelopment);
Inicie o aplicativo:
Name: Mike
Job: Middle Python developer
Isso é tudo o que eu tenho. Obrigado pela atenção! Código fonte no link Meu carrinho do GitHub Conteúdo do curso Continua...
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION