[Primavera] Implementación de Spring de IoC

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.

Supongo que te gusta

Origin blog.csdn.net/m0_53022813/article/details/131988949
Recomendado
Clasificación