Spring Framework-02-02-Spring's Bean injection de dépendances


Insérez la description de l'image ici

Insérez la description de l'image ici

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

Insérez la description de l'image ici
Injection par méthode de construction

Structure du projet

Insérez la description de l'image ici

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>

Insérez la description de l'image ici

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.

Insérez la description de l'image ici

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;

Insérez la description de l'image ici

Type d'injection simple

Structure du projet

Insérez la description de l'image ici

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

Insérez la description de l'image ici

La seconde est une classe interne anonyme, qui ne peut être utilisée que dans une petite zone.

Liste et tableau

Insérez la description de l'image ici

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

Insérez la description de l'image ici

	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

Insérez la description de l'image ici

	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

Insérez la description de l'image ici

Définir la fusion

Insérez la description de l'image ici
Simuler l'héritage Java
Insérez la description de l'image ici

Insérez la description de l'image ici
L'attribut abstrait est défini comme abstrait, il n'est plus concrètement instancié, et est principalement utilisé dans les modèles

Je suppose que tu aimes

Origine blog.csdn.net/qq_44627608/article/details/114908554
conseillé
Classement