2、IOC

发布时间 2023-08-27 10:28:01作者: AnJiaYu

2、IOC

2.1、IOC依赖注入

  1. UserDao 接口

    public interface UserDao {
       public void getUser();
    }
  2. UserDaoImpl 实现类

    public class UserDaoImpl implements UserDao{
       @Override
       public void getUser() {
           System.out.println("默认获取用户");
      }
    }

     

  3. UserService 业务层接口

    public interface UserService {
       public void getUser();
    }

     

  4. UserServiceImpl 接口实现

    public class UserServiceImpl implements UserService{
      private UserDao userDao=new MySqlImpl();
       @Override
       public void getUser() {
           userDao.getUser();
      }
    }

这样是我们以前正常的写法,这样的写法有一个弊端,就是在service 实现的时候用户的创建是写死的如果Dao层也有多个实现类的话,这样我们在创建的时候,就会有很大的局限性,比如

 

在这个Dao接口有多个实现,我们在执行方法的时候需要修改创建对象的代码

而我们可以在ServiceImpl中采用一个set方法,来实现对不同用户的执行

public class UserServiceImpl implements UserService{
  private UserDao userDao=null;

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

   @Override
   public void getUser() {
       userDao.getUser();
  }
}

这样,我们只需要在测试类中加上一个

public class Test {
   public static void main(String[] args) {
       UserServiceImpl userService = new UserServiceImpl();
       userService.setUserDao(new UserDaoImpl());
       userService.getUser();
  }
}

就可以实现不同实现的调用,两种方法,都是做了一样的事情,但是本质上的区别,第一种实例化对象是由系统决定的,而第二种,利用了传递参数的形式来实例化对象,这这种创建对象的方式是由使用程序的人来决定创建那个对象,这就是控制反转。通过这个简单的set方法将程序主动创建对象,转变为程序被动创建对象

控制反转的引入,大大降低了程序的耦合性

 

2.2、IOC本质

控制反转IoC(Inversion of Control),是一种设计思想DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

2.3、IOC容器

 

2.4、HelloSpring

首先建一个类

public class Hello {
   private String str;

   public String getStr() {
       return str;
  }

   public void setStr(String str) {
       this.str = str;
  }

   @Override
   public String toString() {
       return "Hello{" +
               "str='" + str + '\'' +
               '}';
  }
}

接下来,在resource下创建一个Beans.xml文件

然后去Spring官网,找到配置文件的头

<?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
       https://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id="..." class="...">  
       <!-- 这个bean的合作者和配置在这里 -->
   </bean>

   <bean id="..." class="...">
       <!-- c这个bean的合作者和配置在这里 -->
   </bean>

   <!-- 更多bean 定义在这里 -->

</beans>

我们在这里采用Bean标签,来实现类的托管 在配置文件中配置好类的Bean 之后

我们只需要在测试类里面去拿到容器

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//这个方法,可以传递多个参数,来读取多个配置文件

测试类

public class MyTest {

   public static void main(String[] args) {
       ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Beans.xml");

       HelloSpring hello = (HelloSpring) applicationContext.getBean("Hello");

       System.out.println(hello.getStr());


  }
}

这里要注意、Spring最新版本6.xx版本,对JavaJdk的要求是最低是17,如果使用Java8版本就会出现错误,如果jdk是8版本的可以使用spring5以下的版本