6.3 Java EE - Inversión de Control e Inyección de Dependencia

1. El concepto de inversión de control

Principios tradicionales de programación orientada a objetos

        Inversion of Control (Inversion of Control, abreviado como IoC) es un principio de diseño en la programación orientada a objetos, que se utiliza para reducir el acoplamiento entre códigos de programa. En la programación tradicional orientada a objetos, la forma de obtener un objeto es usar la palabra clave new para crear activamente un objeto, lo que significa que la aplicación tiene control sobre el objeto. El principio de la programación tradicional orientada a objetos se muestra en la figura.

Principios de diseño de IoC

         El mecanismo de inversión de control de IoC significa que el contenedor de IoC administra los objetos de manera uniforme. Cuando un programa necesita usar un objeto, puede obtenerlo directamente del contenedor de IoC. Esto transfiere el control del objeto de la aplicación al contenedor IoC. El principio de diseño de IoC se muestra en la figura. Utiliza el contenedor IoC para realizar el desacoplamiento entre objetos con dependencias. Después de encapsular cada clase de objeto, estas clases de objetos se asocian a través del contenedor IoC.

2. El concepto de inyección de dependencia

¿Qué es la inyección de dependencia?

         Inyección de dependencia (DI para abreviar) significa que el contenedor IoC inyecta dinámicamente ciertos recursos dependientes en objetos durante el tiempo de ejecución. Por ejemplo, inyecte (asigne) el objeto B en una variable miembro del objeto A. La idea básica de la inyección de dependencia es: definir claramente la interfaz del componente, desarrollar cada componente de forma independiente y luego ensamblar y ejecutar de acuerdo con las dependencias de los componentes.

Comparación de inyección de dependencia e inversión de control

        La inyección de dependencia (DI) y la inversión de control (IoC) describen lo mismo desde diferentes ángulos. La inyección de dependencia se describe desde la perspectiva de la aplicación, es decir, la aplicación se basa en el contenedor de IoC para crear e inyectar los recursos externos que necesita; mientras que la inversión de control se describe desde la perspectiva del contenedor de IoC, es decir, el contenedor de IoC controla la aplicación, y el contenedor de IoC inyecta de manera inversa los recursos externos que necesita la aplicación en la aplicación. El recurso externo mencionado aquí puede ser un objeto de instancia externa o un objeto de archivo externo, etc. 

3. Tipos de inyección de dependencia

Implementación de inyección de dependencia

         El papel de la inyección de dependencia es inyectar dinámicamente los objetos de los que depende en el componente Bean al crear objetos usando el marco Spring. Por lo general, hay dos implementaciones de inyección de dependencia, una es la inyección de constructor y la otra es la inyección de método de establecimiento de atributos. Estos dos métodos de implementación se describen en detalle a continuación.

inyección de constructor

         Inyección de constructor significa que el contenedor Spring invoca al constructor para inyectar la instancia dependiente.El constructor puede ser parametrizado o no paramétrico. Después de que Spring lea la información de configuración, llamará al método de construcción de la instancia a través de la reflexión.Si se trata de un método de construcción con parámetros, puede pasar los valores de los parámetros requeridos en el método de construcción y, finalmente, crear un objeto de clase.

A continuación se muestra la implementación de la inyección de constructor a través de un caso, y los pasos específicos son los siguientes.

        Escriba la clase de usuario: cree una nueva clase Usuario1 y defina tres atributos de id, nombre y contraseña en la clase Usuario1.

public class User1 {

  private int id;   private String name;   private String password;

  public User1(int id, String name, String password){

      this.id=id; this.name=name;

      this.password=password; }

  public String toString(){

      return "id="+id+",name="+name+",password="+password;

  }}

Obtenga la información de configuración del Bean: cree el archivo applicationContext-User.xml y agregue la información de configuración de la clase User1 en el archivo.

<bean id="user1" class="com.mac.User1">

        <constructor-arg name="id" value="1">

        </constructor-arg>

        <constructor-arg name="name" value="张三">

        </constructor-arg>

        <constructor-arg name="password" value="123"></constructor-arg>

</bean>

elemento <constructor-arg>

  Un elemento <constructor-arg> representa un parámetro del método de construcción, y la definición no distingue el orden, solo es necesario especificar el parámetro a través del atributo de nombre del elemento <constructor-arg>. El elemento <constructor-arg> también proporciona el atributo de tipo para especificar el tipo del parámetro, evitando la confusión entre cadenas y tipos de datos básicos.

Escribe una clase de prueba:

        Cree una clase de prueba TestUser1 para probar el resultado de la inyección de dependencia.

public class TestUser1 {

    public static void main(String[] args)throws Exception{

        //加载applicationContext.xml配置

        ApplicationContext applicationContext=new 

        ClassPathXmlApplicationContext("applicationContext-User.xml");

        //获取配置中的User1实例

        User1 user1=applicationContext.getBean("user1", User1.class);

        System.out.println(user1);

    }

}

Inyección de método de establecimiento de propiedades

        La inyección del método de establecimiento de atributos es el método de inyección más convencional en Spring. Este método de inyección es simple e intuitivo. Declara un método de establecimiento en la clase inyectada e inyecta el valor correspondiente a través de los parámetros del método de establecimiento.

La implementación de la inyección del método de establecimiento de atributos se demuestra a través de un caso, y los pasos específicos son los siguientes.

Escriba una clase de usuario:

        Cree una nueva clase User2 y defina tres atributos de id, nombre y contraseña en la clase User2.

public class User2 {
    private int id;
    private String name;
    private String password;
    public void setId(int id){
        this.id=id;
    }
    public void setName(String name){
        this.name=name;
    }
    public void setPassword(String password){
        this.password=password;
    }
    public String toString(){
        return "id="+id+",name="+name+",password="+password;
    }
}

Obtenga la información de configuración del Bean: cree el archivo applicationContext-User2.xml y agregue la información de configuración de la clase User2 al elemento bean del archivo.

Escriba una clase de prueba: cree una clase de prueba TestUser2 para probar los resultados de la inyección de dependencia.

public class TestUser2 {

    public static void main(String[] args)throws Exception {

        //加载applicationContext.xml配置

        ApplicationContext applicationContext = new 

        ClassPathXmlApplicationContext("applicationContext-User2.xml");

        //获取配置中的User2实例

        User2 user2 = applicationContext.getBean("user2", User2.class);

        System.out.println(user2);

}}

En cuarto lugar, la aplicación de la inyección de dependencia.

A continuación, se toma la inyección del método de establecimiento de propiedades como ejemplo para implementar una verificación de inicio de sesión simple. Los pasos de implementación específicos son los siguientes.

(1) Escriba la capa DAO: cree la interfaz UserDao.java y agregue el método login() a la interfaz UserDao.java para implementar la función de inicio de sesión.

public interface UserDao {

    public boolean login(String name,String password);

}

(2) Escriba la clase de implementación de la capa DAO: cree la clase de implementación UserDaoImpl de la interfaz UserDao e implemente el método login() en la clase UserDaoImpl.

public class UserDaoImpl implements UserDao {

    @Override

    public boolean login(String name, String password) {

        if (name.equals(“张三”)&&password.equals(“123”)){ 

return true;

        }

        return false;

    }

}

(1) Escriba la capa de servicio: cree un nuevo paquete de servicio, cree una interfaz UserService.java debajo del paquete de servicio y agregue el método login() a la interfaz.

public interface UserService {

    public boolean login(String name,String password);

}

(2) Escriba la clase de implementación de la capa de servicio: cree la clase de implementación UserServiceImpl de la interfaz UserService e implemente el método login() en la clase UserServiceImpl.

public class UserServiceImpl implements UserService {

    UserDao userDao;

    public void setUserDao(UserDaouserDao)

        { this.userDao=userDao; }

    @Override

    public boolean login(String name, String password) {

        return userDao.login(name,password);

    }

}

(3) Escriba el archivo de configuración applicationContext.xml: use el elemento <bean> para agregar instancias de la clase UserDaoImpl y la clase UserServiceImpl creadas, y configure sus propiedades relacionadas.

<bean id="userDao" class="com.mac.dao.impl.UserDaoImpl"></bean>

<bean id=“userService”class="com.mac.service.impl

.UserServiceImpl">

<property name="userDao" ref="userDao">

        </property>

</bean>

(4) Escriba una clase de prueba: cree una nueva clase de prueba TestSpring en el paquete com.mac.

public class TestSpring {

    public static void main(String[] args) {

        // 加载applicationContext.xml配置

        ApplicationContext applicationContext=new 

        ClassPathXmlApplicationContext("applicationContext.xml");

        UserService userService=(UserService) // 获取配置中的UserService实例

        applicationContext.getBean("userService");

        boolean flag =userService.login("张三","123");

        if (flag) { System.out.println("登录成功");

        } else { System.out.println(“登录失败"); }

}}

Supongo que te gusta

Origin blog.csdn.net/W_Fe5/article/details/131663444
Recomendado
Clasificación