E assim... Continuamos o nosso rumo na Primavera. Na última lição estudamos injeção de dependência usando um setter. Se você percebeu, implementamos valores usando links para id. Ou seja, a implementação ocorreu utilizando o atributo ref. Parecia algo assim: Listagem 1
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="hiringDepartment" class="org.example.HiringDepartment">
<property name="development" ref="javaDeveloper"/>
</bean>
Aqui, 4 linhas referem-se ao id "javaDeveloper", que implementa o valor da classe JavaDevelopment. E se quisermos injetar os valores manualmente ou obter de alguma outra forma e depois injetar. Vejamos um exemplo. Cada funcionário tem cidadania e salário. E deixe essas entidades serem definidas na classe HiringDepartment. Digamos isto: Listagem 2
package org.example;
public class HiringDepartment {
private Development development; //Определяем интерфейс
private int salary;
private String citizenship;
public void displayInfo(){
System.out.println("Name: " + development.getName());
System.out.println("Job: " + development.getJob());
}
public void setDevelopment(Development development){
this.development = development;
}
public Development getDevelopment(){
return development;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getCitizenship() {
return citizenship;
}
public void setCitizenship(String citizenship) {
this.citizenship = citizenship;
}
}
Aqui adicionamos 2 campos. salário interno e cidadania String . Também definimos getters e setters para esses objetos. Como lembrete, Spring refere-se a esses getters e setters nos bastidores para vincular valores a objetos de classe. Ainda não estamos tocando em outras classes. E então refazemos o arquivo applicationContext, que define os beans para nossos objetos. E 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<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="javaDeveloper"/>
<property name="citizenship" value="USA"/>
<property name="salary" value="5000"/>
</bean>
</beans>
Diferentemente da Listagem 1, mais duas propriedades foram adicionadas aqui (linhas 12 e 13). É aqui que entra em jogo o atributo value , que é definido dentro da tag de propriedade. Deixe-me lembrá-lo mais uma vez que o valor do atributo name deve corresponder ao objeto ao qual o bean se refere. E então o Spring determina getters e setters de forma independente usando esses valores. E usando o atributo value implementamos valores para os campos. Observe que ambos os valores são definidos entre aspas, embora isso seja incomum para o tipo int. Mas o Spring, como sempre, determina qual valor deve ser associado a qual tipo. Isso acontece devido ao atributo name . Pelo nome do bean, Spring se refere a um objeto da classe e determina o tipo desse objeto. Bom, isso é tudo. Agora só falta conferir nossas atualizações na classe Main: Listagem 5
package org.example;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String ... args){
//Определяем контекст файл в котором содержатся прописанные нами бины
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//Получем бины, которые были определены в файле applicationContext.xml
HiringDepartment hiringDepartment = context.getBean("hiringDepartment", HiringDepartment.class);
hiringDepartment.displayInfo();
System.out.println("Citizenship: " + hiringDepartment.getCitizenship());
System.out.println("Salary: " + hiringDepartment.getSalary());
context.close(); //Контекст всегда должен закрываться
}
}
Não há necessidade de mudar muito aqui. Somente para obter resultados chamamos getters da classe HiringDepartment usando o fluxo de saída padrão. Como resultado, obtemos a seguinte resposta:
Name: Alexa
Job: Middle Java developer
Citizenship: USA
Salary: 5000
OK. Digamos que temos 10 desses funcionários que têm a mesma cidadania e recebem o mesmo salário. E digamos que a empresa decidiu aumentar seus salários. Então você terá que alterar manualmente todos esses 10 valores. É muito chato. E se definirmos esses valores em um arquivo separado e associarmos esses valores aos beans? Então só teríamos que alterar o valor uma vez neste arquivo, e os beans restantes que fazem referência a esse valor seriam alterados automaticamente. Vamos tentar... Para isso faremos algumas atualizações na estrutura do projeto e no arquivo applicationContext.xml. Primeiro, na pasta de recursos, adicione um novo arquivo com a extensão .properties . Chamei esse arquivo de "myApp.properties". Agora a estrutura do projeto assumiu a seguinte forma: E no arquivo escreveremos os seguintes valores:
employee.citizenship="Russia"
employee.salary=6000
À esquerda do sinal "=" estão os nomes das variáveis (se puderem ser chamadas assim) e à direita estão os valores dessas variáveis. Você pode dar o nome que quiser, mas como sempre, com significado. E sim, o período aqui desempenha um papel estratégico, não sintático. Digamos que também temos gestores, também com salários próprios. Então podemos simplesmente nomear essas variáveis da seguinte forma: manager.salary. Ou seja, os nomes das variáveis não coincidirão e interferirão entre si. Agora vamos atualizar o arquivo applicationContext.xml. Antes de declarar beans, você deve escrever a seguinte linha:
<context:property-placeholder location="classpath:myApp.properties"/>
Aqui definimos o arquivo que criamos para incorporar os valores. E então no atributo value colocamos um cifrão $ entre aspas duplas e entre chaves {} escrevemos o nome da variável do arquivo myApp.properties:
<property name="salary" value="${employee.salary}"/>
Como resultado, o Spring procura essa variável, obtém seu valor e a anexa ao objeto da classe. O código completo fica assim: Listagem 6
<?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">
<context:property-placeholder location="classpath:myApp.properties"/>
<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="javaDeveloper"/>
<property name="citizenship" value="${employee.citizenship}"/>
<property name="salary" value="${employee.salary}"/>
</bean>
</beans>
Vamos lançar o programa:
Name: Alexa
Job: Middle Java developer
Citizenship: "Russia"
Salary: 6000
Como sempre, a melhor maneira de aprender programação é programando. Repita o que você aprendeu, tente atualizar os elementos, brinque com o código. Resumindo, vá em frente. E isso é tudo para mim. Obrigado pela sua atenção! Código fonte no link Meu GitHub Entre no meu canal de telegram Conteúdo do curso Continua...
GO TO FULL VERSION