¿Sabe que hay varias formas de inyección de dependencia Spring DI?

Para aquellos que deseen más información relacionada, ¡consulte la introducción personal en la página de inicio!

La forma de primavera de instanciar los frijoles

  • Establecer inyección
  • Inyección de constructor
  • Inyección estática de fábrica
  • Inyección de fábrica instanciada

Práctica de caso

Establecer inyección

configuración xml (al mismo tiempo, Spring también proporciona un método de inyección establecido para tipos de datos básicos)

<?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="userDao" class="com.xxx.demo.UserDao"></bean>
	<!-- setter注入 -->
	<bean id="userService" class="com.xxx.demo.UserService">
        <!--ref是对于外部bean对象引用,与被引用的bean对象的id保持一致-->
		<property name="userDao" ref="userDao"></property>
	</bean>
</beans>

UserDao.java

public class UserDao {
    
    
	public String userLogin() {
    
    
		return	"我是UserDao中的userLogin()的方法";
	}
}

UserService.java

public class UserService {
    
    
    //一定要提供属性的setter方法
	private UserDao userDao;
	
	public void userlogin() {
    
    
		String res=userDao.userLogin();
		System.out.println(res);
	}

	public void setUserDao(UserDao userDao) {
    
    
		this.userDao = userDao;
	}
}

App.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    
    
	public static void main(String[] args) {
    
    
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
		UserService userService=applicationContext.getBean("userService", UserService.class);
		userService.userlogin();
	}
}

Inyección de constructor

configuración xml (también proporciona inyección de tipos de datos básicos, cadenas, etc.)

<?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="userDao" class="com.xxx.demo.UserDao"></bean>
	<!-- 构造器注入 -->
	<bean id="userServiceV2" class="com.xxx.demo.UserServiceV2">
		<constructor-arg index="0" ref="userDao"></constructor-arg>
		<constructor-arg index="1" value="印度三哥"></constructor-arg>
	</bean>
</beans>

Hay tres formas de inyección de constructor:

El atributo de índice es el orden de los parámetros, si solo hay un índice de parámetro, no es necesario configurarlo.

El atributo de nombre se basa en el nombre del atributo en el constructor.

El atributo de tipo se compara de acuerdo con el tipo de atributo en el constructor. Si los atributos del mismo tipo no son únicos, los atributos inyectados se inyectan en orden.

La clase UserServiceV2.java proporciona un constructor

/**
 * 实现构造器注入
 * @author Best Liu
 *
 */
public class UserServiceV2 {
    
    
	private UserDao userDao;
	private String name;
	public void userlogin() {
    
    
		String res=userDao.userLogin();
		System.out.println(res);
		System.out.println(name);
	}
	public UserServiceV2(UserDao userDao,String name) {
    
    
		super();
		this.userDao = userDao;
		this.name = name;
	}
}

Inyección estática de fábrica

colocación xml

<?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="userDao01" class="com.xxx.demo.StaticFactory" factory-method="createuserDao"></bean>
	<bean id="userService01" class="com.xxx.demo.UserService">
		<property name="userDao" ref="userDao01"></property>
	</bean>
</beans>

StaticFactory.java

public class StaticFactory {
    
    
	public static UserDao createuserDao(){
    
    
		return new UserDao();
	}
}

UserService.java

public class UserService {
    
    
	private UserDao userDao;
	
	public void userlogin() {
    
    
		String res=userDao.userLogin();
		System.out.println(res);
	}

	public void setUserDao(UserDao userDao) {
    
    
		this.userDao = userDao;
	}
}

Sugerencias: La inyección de fábrica estática es la inyección de establecimiento de fábrica estática de IoC y DI. Los objetos de propiedad que deben inyectarse se crean utilizando la fábrica estática.

2.4 Instancia de la fábrica

colocación xml

<?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="instanceFactory" class="com.xxx.demo.InstanceFactory"></bean>
	<bean id="userDao3" factory-bean="instanceFactory" factory-method="createUserDao"></bean>
	<bean id="userService02" class="com.xxx.demo.UserService">
		<property name="userDao" ref="userDao3"></property>
	</bean>
</beans>

InstanceFactory.java

public class InstanceFactory {
    
    
	public UserDao createUserDao(){
    
    
		return new UserDao();
	}
}

consejos: Concéntrese en dominar el conjunto, la inyección del constructor y comprender el método de fábrica. En el desarrollo real, el método de conjunto se utiliza básicamente para inyectar beans.

Expandir

El problema de la dependencia circular

Los beans se inyectan a través del constructor y se basan entre sí para que el bean no pueda instanciarse.

Opciones de inyección: la primera opción para inyección fija en proyectos de desarrollo

Use la inyección de construcción para completar el establecimiento de la relación de dependencia al mismo tiempo que se construye el objeto. Una vez que el objeto está establecido, todo está listo. Sin embargo, si hay muchas relaciones de objeto por establecer, el uso de la inyección de construcción dejará una en El constructor. Una lista larga de parámetros no es fácil de recordar. En este momento, usar la inyección Set será una buena opción.

El uso de la inyección de conjuntos puede tener un nombre claro, puede comprender cuál será el objeto inyectado, un nombre como setxxx () es mejor que recordar la posición de un parámetro en el Constructor para representar un objeto determinado.

colocación xml

<?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="goodsService" class="com.xxx.demo.GoodsService">
		<!-- <constructor-arg index="0" ref="userService"></constructor-arg> -->
		<property name="userService" ref="userService"></property>
	</bean>
	<bean id="userService" class="com.xxx.demo.UserService">
		<!-- <constructor-arg index="0" ref="goodsService"></constructor-arg> -->
		<property name="goodsService" ref="goodsService"></property>
	</bean>
</beans>

GoodsService.java

public class GoodsService {
    
    
	private UserService userService;
	/*public GoodsService(UserService userService) {
		super();
		this.userService = userService;
	}*/
	public void setUserService(UserService userService) {
    
    
		this.userService = userService;
	}
}

UserService.java

public class UserService {
    
    
	private GoodsService goodsService;
/*	public UserService(GoodsService goodsService) {
		super();
		this.goodsService = goodsService;
	}
*/
	public void setGoodsService(GoodsService goodsService) {
    
    
		this.goodsService = goodsService;
	}	
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/xyx12321/article/details/111315201
Recomendado
Clasificación