IoC(控制反转)和DI(依赖注入)

Posted 红颜莫知己

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IoC(控制反转)和DI(依赖注入)相关的知识,希望对你有一定的参考价值。

IoC

1.添加工厂建立所需要的依赖

我们使用maven的时候,能使用依赖就使用依赖,可以方便我们很多,比如lombok,junit等依赖

<properties>
       <spring-version>5.2.5.RELEASE</spring-version>
   </properties>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
    </dependencies>

2.加入实体类

User

package edu.xalead;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
    private String sex;
}

UserDao

package edu.xalead;

public class UserDao {
    public User findUser(){
        User u = new User(1000,"张三",22,"男");
        return u;
    }
}

3.创建配合文件beanFactory.xml

该文件放在resource目录底下
在这里插入图片描述

这里bean标签中的id为名字,class为所属类

<?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="edu.xalead.UserDao"></bean>
</beans>

写测试类TestSpringContext.java

public class TestSpringContext {

    /**
     * 测试Spring工厂实例化及获取对象
     */
    @Test
    public void test1(){
        //创建工厂
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
        //从工厂中拿配置好的实例
        UserDao userDao = (UserDao) beanFactory.getBean("userDao");
        User user = userDao.findUser();
        System.out.println(user);
    }
}

这里的ClassPath指的就是resource目录

在使用getBean()方法的时候,我们只能取到Object类,因为通过名字不知道是什么类型,所以我们要进行强转,当然我们还以为有另一种方法写

 UserDao userDao = beanFactory.getBean(UserDao.class);

但是这样写有一个缺点,那就是你只能在xml文件里配置一个,如果配置两个系统就无法知道你指的是哪一个,所以我们一般还是使用名字来获取。

 <bean id="userDao" class="edu.xalead.UserDao"></bean>
 <bean id="userDao1" class="edu.xalead.UserDao"></bean>

这里报错不是唯一Bean
在这里插入图片描述

DI

创建实体类

UserServlet

package edu.xalead;

import lombok.Setter;

@Setter
public class UserServlet {
    private UserService userService;
    public void findUser(){
        System.out.println("spring工厂的示例");
        System.out.println(userService.findUser());
    }
}

我们现在通过Servlet来访问刚才的数据,当然我们现在这里的servlet是一个假的,真正的Servlet是由服务器创建的

Spring对象间的依赖注入

property标签中的ref你注入对象的名字,name指你给这个所注入的对象起的名字

 <bean id="userDao" class="edu.xalead.UserDao"></bean>
    <bean id="userServlet" class="edu.xalead.UserServlet">
        <property name="userDao" ref="userDao"/>
    </bean>

测试案例

 @Test
    public void test2(){
        //创建工厂
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
        //从工厂中拿配置好的UserServlet实例
        UserServlet userServlet = beanFactory.getBean(UserServlet.class);
        userServlet.findUser();
    }

在这里插入图片描述
若有误,请指教!

以上是关于IoC(控制反转)和DI(依赖注入)的主要内容,如果未能解决你的问题,请参考以下文章

Spring_IOC控制反转和DI依赖注入

spring IOC(控制反转)及DI(依赖注入)

PHP 依赖注入(DI) 和 控制反转(IoC)

spring核心思想:IOC(控制反转)和DI(依赖注入)

控制反转(IOC)和依赖注入(DI)的区别

如何理解 PHP的依赖注入(DI) 和 控制反转(IoC)