Répertoire d'articles
La méthode d'injection Setter est la plus utilisée
- L'équipe de développement Spring recommande généralement d'utiliser l'injection de constructeur lorsque le composant d'application implémenté est un objet immuable et de s'assurer que les dépendances requises ne sont pas nulles.
- D'un autre côté, un grand nombre de paramètres de constructeur provoquent une mauvaise odeur de code, ce qui indique que la classe peut prendre trop de responsabilités et devrait avoir besoin d'être refactorisée afin de mieux séparer les problèmes à résoudre.
- L'un des avantages de l'injection de setter est que la méthode setter permet aux objets de cette classe d'être raisonnablement reconfigurés ou réinjectés à un moment donné dans le futur, et il est lisible
Injection constructeur
Injection par méthode de construction
Structure du projet
Teacher.java
package com;
public class Teacher {
private int id;
private String name;
//无参数
public Teacher() {
}
//有参数
public Teacher(int id, String name) {
this.id = id;
this.name = name;
}
public void show() {
System.out.println("id:"+id+",name:"+name);
}
}
Test.java
package com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Teacher t = (Teacher)ctx.getBean("Teacher");
t.show();
}
}
Beans.xml
<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-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 构造器注入形式1,简单但是对顺序与数量有要求,必须与Teacher类一致才行 -->
<!--
<bean id="Teacher" class="com.Teacher">
<constructor-arg value="1"></constructor-arg>
<constructor-arg value="zhangSan"></constructor-arg>
</bean>
-->
<!-- 构造器注入形式2,通过id属性确定赋值目标 -->
<!--
<bean id="Teacher" class="com.Teacher">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="zhangsan"></constructor-arg>
</bean>
-->
<!-- 构造器注入形式3,通过name属性确定赋值目标 -->
<!--
<bean id="Teacher" class="com.Teacher">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="zhangsan"></constructor-arg>
</bean>
-->
</beans>
Avantages et inconvénients
Le code est simple, mais la lisibilité est médiocre.
Injection de méthode Setter
- Après avoir appelé le constructeur sans paramètre ou la méthode de fabrique statique sans paramètre pour instancier le bean, le conteneur peut terminer l'injection de dépendances en rappelant la méthode setter du bean.
Si le type injecté est un type référence, utilisez l'attribut ref, et le paramètre est l'id du bean défini ci-dessus;
Type d'injection simple
Structure du projet
DiClass.java
package com;
import java.sql.DriverManager;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class DiClass {
private int id;
private String name;
private Teacher teacher;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public void show() {
System.out.println(id);
System.out.println(name);
System.out.println("==========================");
teacher.show();
}
}
Teacher.java
package com;
public class Teacher {
private int id;
private String name;
//无参数
public Teacher() {
}
//有参数
public Teacher(int id, String name) {
this.id = id;
this.name = name;
}
public void show() {
System.out.println("id:"+id+",name:"+name);
}
}
Test.java
package com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
DiClass dc = (DiClass)ctx.getBean("DiClass");
dc.show();
}
}
Beans.xml
<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-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 构造器注入形式1,简单但是对顺序与数量有要求,必须与Teacher类一致才行 -->
<!--
<bean id="Teacher" class="com.Teacher">
<constructor-arg value="1"></constructor-arg>
<constructor-arg value="zhangSan"></constructor-arg>
</bean>
-->
<!-- 构造器注入形式2,通过id属性确定赋值目标 -->
<!--
<bean id="Teacher" class="com.Teacher">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="zhangsan"></constructor-arg>
</bean>
-->
<!-- 构造器注入形式3,通过name属性确定赋值目标 -->
<bean id="Teacher" class="com.Teacher">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="zhangsan"></constructor-arg>
</bean>
---------------------------------------------------------------
<!-- ref的参数是上面定义的Bean的id -->
<bean id="DiClass" class="com.DiClass">
<property name="id" value="100"></property>
<property name="name" value="lisi"></property>
<property name="teacher" ref="Teacher" ></property>
</bean>
</beans>
Injection de type complexe
Type de données de référence et classe interne anonyme / bean interne
La seconde est une classe interne anonyme, qui ne peut être utilisée que dans une petite zone.
Liste et tableau
package com;
import java.sql.DriverManager;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class DiClass {
private List bookName;
private Set hobby;
public void setBookName(List bookName) {
this.bookName = bookName;
}
}
<!-- List类型与数组类型 -->
<property name="bookName">
<list>
<value>Java</value>
<value>c#</value>
<!-- ref=上面的自定义ID -->
<ref bean="Teacher"/>
</list>
</property>
Régler
private Set hobby;
public void setHobby(Set hobby) {
this.hobby = hobby;
}
<!-- set类型,不会放重复的数据 -->
<property name="hobby">
<set>
<value>book</value>
<value>football</value>
<ref bean="Teacher"/>
<value>book</value>
</set>
</property>
Carte
private Set hobby;
private Map map;
public void setMap(Map map) {
this.map = map;
}
<!-- HashMap -->
<property name="map">
<map>
<!-- key=键 ,value=数值 -->
<entry key="a" value="100"></entry>
<!-- key-ref=引用数据类型,加上ref的都是Bean的引用数据类型 -->
<entry key-ref="Teacher" value="200"></entry>
<entry key="b" value-ref="Teacher"></entry>
</map>
</property>
Propriétés
Définir la fusion
Simuler l'héritage Java
L'attribut abstrait est défini comme abstrait, il n'est plus concrètement instancié, et est principalement utilisé dans les modèles