Basado en el último tutorial de Spring Framework de [Power Node], el primer tutorial de Spring 6 en toda la red, aprenda Spring desde cero hasta avanzado con Lao Du y las notas originales de Lao Du https://www.yuque.com/docs/share /866abad4-7106 -45e7-afcd-245a733b073f?# "Spring6" está organizado, contraseña del documento: mg9b
Los artículos relacionados con la primavera se compilan y resumen en: https://www.yuque.com/u27599042/zuisie
Inversión de control del COI
- La inversión del control es un pensamiento.
- La inversión de control consiste en reducir el acoplamiento del programa, mejorar la escalabilidad del programa, lograr los principios de OCP y lograr los principios de DIP.
- Inversión de control, ¿qué se invierte?
- Entregue el derecho a crear objetos a un contenedor de terceros.
- El derecho a mantener la relación entre objetos y objetos se cede al tercero contenedor.
- Implementación de la idea de inversión de control: DI (Dependency injection, inyección de dependencia)
inyección de dependencia
- La inyección de dependencia implementa la idea de inversión de control.
- Spring completa la gestión de Bean mediante inyección de dependencia.
- Gestión de Bean: la creación de objetos Bean y la asignación de atributos en objetos Bean (o el mantenimiento de relaciones entre objetos Bean).
- Inyección de dependencia:
- La dependencia se refiere a la relación entre objetos y objetos.
- La inyección se refiere a un comportamiento de transferencia de datos, a través del comportamiento de inyección para hacer que los objetos y los objetos tengan una relación.
- Hay dos métodos de implementación comunes para la inyección de dependencia:
- El primer tipo: inyección fija
- El segundo tipo: inyección de constructor.
establecer inyección
- La inyección de conjuntos se implementa en función del método establecido. La capa inferior llamará al método establecido correspondiente al atributo a través del mecanismo de reflexión y luego asignará el atributo.
- Este método requiere que el atributo proporcione un método establecido externamente.
Uso de inyección fija
public class UserDao {
// 获取本类的日志记录器
private static final Logger logger = LoggerFactory.getLogger(UserDao.class);
public void insert(){
// 使用一下log4j2日志框架
logger.info("数据库正在保存用户信息。");
}
}
public class VipDao {
// 获取本类的日志记录器
private static final Logger logger = LoggerFactory.getLogger(VipDao.class);
public void insert(){
logger.info("正在保存Vip信息!!!!");
}
}
public class UserService {
private UserDao userDao;
private VipDao vipDao;
public void setAbc(VipDao vipDao){
this.vipDao = vipDao;
}
// set注入,必须提供一个set方法。
// Spring容器会调用这个set方法,来给userDao属性赋值。
// 我自己写一个set方法,不使用IDEA工具生成的。不符合javabean规范。
// 至少这个方法是以set单词开始的。前三个字母不能随便写,必须是“set"
/*public void setMySQLUserDao(UserDao xyz){
this.userDao = xyz;
}*/
// 这个set方法是IDEA工具生成的,符合javabean规范。
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(){
// 保存用户信息到数据库
userDao.insert();
vipDao.insert();
}
}
<?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">
<!--配置dao-->
<bean id="userDaoBean" class="com.powernode.spring6.dao.UserDao"/>
<!--配置service-->
<bean id="userServiceBean" class="com.powernode.spring6.service.UserService">
<!-- 想让Spring调用对应的set方法,需要配置property标签 -->
<!-- name属性值:set方法的方法名,去掉set,然后把剩下的单词首字母变小写。-->
<!-- ref翻译为引用,英语单词:referencesref,其属性值指定的是要注入的bean的id。-->
<!--<property name="mySQLUserDao" ref="userDaoBean"/>-->
<!--set方法起名的时候,不要为难自己,按照规范来。所以一般情况下name位置写属性名就行了。-->
<property name="userDao" ref="userDaoBean"/>
<!--<property name="vipDao" ref="vipDaoBean"/>-->
<!-- name属性值:set方法的方法名,去掉set,然后把剩下的单词首字母变小写。 -->
<property name="abc" ref="vipDaoBean"/>
</bean>
<bean id="vipDaoBean" class="com.powernode.spring6.dao.VipDao"/>
</beans>
establecer análisis de inyección
- El principio de implementación de la inyección de conjuntos:
- Obtenga el nombre del atributo a través de la etiqueta de propiedad: userDao
- El nombre del método del método establecido correspondiente al atributo se infiere del nombre del atributo: setUserDao
- Llame al método setUserDao() para asignar valores a las propiedades a través del mecanismo de reflexión
- En general, el nombre del método set cumple con la especificación JavaBean y el valor del atributo del nombre de la etiqueta de propiedad es el nombre del atributo.
- El valor del atributo de nombre de la etiqueta de propiedad se deriva de la evolución del nombre del método setUserDao(). El patrón de evolución es:
- Retire el conjunto y cambie las primeras letras restantes a minúsculas.
- setUsername() evoluciona a nombre de usuario
- setPassword() evoluciona a contraseña
- setUserDao() evolucionó a userDao
- setUserService() evolucionó a userService
- El valor del atributo ref de la etiqueta de propiedad es la identificación del objeto bean que se va a inyectar. El ensamblaje del bean se completa a través del atributo ref. Esta es la forma más sencilla de ensamblar el bean.
- Ensamblaje se refiere a: la acción de crear asociaciones entre componentes del sistema.
- Para las etiquetas de propiedad, el atributo ref también se puede utilizar como etiqueta sin utilizar el atributo ref:
<bean id="userServiceBean" class="com.powernode.spring6.service.UserService">
<property name="userDao">
<ref bean="userDaoBean"/>
</property>
</bean>
- Resumen: El principio de implementación central de la inyección de conjuntos: llamar al método set a través del mecanismo de reflexión para asignar valores a las propiedades y crear una relación entre dos objetos.
inyección constructora
- Principio básico: asigne valores a las propiedades llamando al método constructor.
- En comparación con la inyección de conjuntos, la inyección de constructores se inyecta mientras se crea el objeto y se asignan atributos, mientras que la inyección de conjuntos se realiza después de crear el objeto.
public class CustomerService {
private UserDao userDao;
private VipDao vipDao;
public CustomerService(UserDao userDao, VipDao vipDao) {
this.userDao = userDao;
this.vipDao = vipDao;
}
public void save(){
userDao.insert();
vipDao.insert();
}
}
<?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="xxxx" class="com.powernode.spring6.dao.UserDao"/>
<bean id="yyyy" class="com.powernode.spring6.dao.VipDao"/>
<bean id="csBean3" class="com.powernode.spring6.service.CustomerService">
<!--不指定下标,也不指定参数名,让spring自己做类型匹配。-->
<!--这种方式实际上是根据类型进行注入的。spring会自动根据类型来判断把ref注入给相应的参数。-->
<constructor-arg ref="yyyy"/>
<constructor-arg ref="xxxx"/>
</bean>
<bean id="csBean2" class="com.powernode.spring6.service.CustomerService">
<!--根据构造方法参数的名字进行注入。-->
<!-- name属性值为要进行注入的构造函数的参数 -->
<constructor-arg name="vipDao" ref="yyyy"/>
<constructor-arg name="userDao" ref="xxxx"/>
</bean>
<bean id="csBean" class="com.powernode.spring6.service.CustomerService">
<!--构造注入-->
<!--
index属性指定参数下标,第一个参数是0,第二个参数是1,第三个参数是2,以此类推。
ref属性用来指定注入的bean的id
-->
<!--指定构造方法的第一个参数,下标是0-->
<constructor-arg index="0" ref="xxxx"/>
<!--指定构造方法的第二个参数,下标是1-->
<constructor-arg index="1" ref="yyyy"/>
</bean>
</beans>
- Existen tres formas de inyección a través de constructores:
- Se puede suscribir
- Puedes pasar el nombre del parámetro.
- Tampoco puede especificar el subíndice ni el nombre del parámetro, y el tipo se puede inferir automáticamente.
- Spring es relativamente robusto en términos de montaje.