Spring框架之IOC(控制反转)

        这学期学JAVA的高级应用开发,一上来学的就是Spring,有点抽象,上网学了一下,做一下笔记。

        IOC(Inversion of Control,控制反转)是Spring框架的一个重要特性,也是设计模式中的一种。传统的程序设计中,我们使用面向对象编程,在代码中通过new关键字来创建对象,并在代码中直接使用它们。而在Spring中,我们把对象的创建和管理交给Spring容器来完成,容器负责将对象注入到代码中所需要的地方,这就是控制反转。

        没有IOC时候写程序都是一层套一层的,耦合在一起,就比如之前我写的Servlet的应用,都是一个文件一个文件跳转;但引入IOC后,实现了系统的解耦,我们将对象的创建和管理交给Spring,想用谁的时候直接拿过来用就可以了。也就是说,如果没有IOC,就需要程序员手动去创建和管理各种对象及其依赖关系,而且每个对象的创建和销毁都需要手动处理(也就是一行一行去改代码,也许少的时候不觉得麻烦,但如果代码很多简直超级麻烦。这样就会增加代码的复杂度,而且容易出错。);而有了IOC,程序员只需要描述对象之间的依赖关系,由Spring框架来负责创建和管理对象。下面我举个例子:

        分层架构是软件开发中的一种常见设计模式,通常分为数据层(Dao层)、业务层(Service层)、控制层(Servlet层)、表现层。将数据层和业务层分开的好处是,可以使得两个层次之间解耦,避免在修改数据访问层代码时对业务逻辑产生影响,同时也使得系统的可维护性更高。那我们如何在不用IOC的情况下,输出获取所有用户的数据呢?

        首先我们创建一个工程,在创建三个package,分别为dao、service、servlet

 在UserDao接口中定义一个方法

 然后创建一个类UserDaoImpl实现这个方法,输出“获取所有用户的数据”

 然后再创建一个UserMysqlImpl类实现这个方法,但输出改为“获取Mysql用户的数据!”

 然后在service层定义一个接口UserService

         之后创建一个类UserServiceImpl实现getName方法。 创建了一个UserDao的接口对象,并将其初始化为UserDaoImpl类的实例。这意味着 UserDaoImpl 类实现了 UserDao 接口,并且可以使用 UserDao 接口中定义的所有方法。然后调用getName方法

在servlet层中,创建一个Test类。调用业务层的方法就可以了

 这样运行出结果

        但如果我们想运行出"获取Mysql用户的数据!"呢,也就是我们要换一个对象。我们只需要把UserServiceImpl类中的创建的实例改一下就可以了,其他不用动。

          很简单对吧,但通常在做项目时,代码是很多的,你需要去业务层一个一个修改对象,费时费力。而且如果这个软件做出来了肯定是要给用户使用的,与用户接触的是表现层,所以当用户每次有需求的时候,怎么可能会麻烦程序员去改业务层的代码呢。

        所以,这就需要IOC了。目录如下:

 使用Spring的配置大家可以自己去网上找,或者以后我有空我也会写。

这里我们创建一个xml文件,这个文件很重要,我们现在就要使用它来管理对象。

        在ApplicationContext.xml中使用<bean>标签给创建对象。<bean id="UserDaoImpl" class="com.spring.dao.UserDaoImpl"/>意思是定义了一个名为“UserDaoImpl”的bean,该bean的类是"com.spring.dao.UserDaoImpl"。通过这个bean定义,Spring可以在运行时实例化一个UserDaoImpl对象,该对象可以在应用程序中被使用,在其他地方通过使用该bean的ID来获取这个对象的引用。

        在下面的<property>标签中(注意这个标签在bean里),这是一个Spring配置文件中的XML元素,用于为UserServiceImpl这个bean设置一个名为"userDao"的属性,属性值引用了名为"UserMysqlImpl"的bean。其中,"userDao"是属性名,"UserMysqlImpl"是引用的bean的ID。

        这是什么意思呢?我们来看service层的UserServiceImpl文件

         这里首先只是声明了一个userdao变量,但没有进行初始化。在这里<property>这个配置的作用是将"UserMysqlImpl"使用setter方法注入到"UserServiceImpl"中的"UserDao"属性中,从而让"UserServiceImpl"能够使用"UserMysqlImpl"提供的数据访问功能。(注意方法set后面的名字要和property标签的name一致)

接下来我们再来看servlet层

创建 ApplicationContext 对象,该对象是 Spring 容器的入口

ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");

通过容器获取 UserServiceImpl 对象,注意这里获取到的对象是在 ApplicationContext.xml 中配置的 Bean,具体 Bean 的 id 为 "UserServiceImpl"。

UserServiceImpl us = (UserServiceImpl)context.getBean("UserServiceImpl");

        在 Spring 容器中,通过配置文件可以将类实例化为 Bean,并且在实例化的同时进行属性的注入。通过 Spring 容器获取 Bean 对象后,我们就可以直接使用这些对象进行开发,而不用再手动实例化这些对象或者手动注入这些对象的属性,这也是 Spring IoC(控制反转)的核心思想。

        也就是说我们只需要修改xml配置文件,就可以做到想用谁用谁,想输出什么就输出什么了,这就是IOC强大的地方。

猜你喜欢

转载自blog.csdn.net/m0_56540237/article/details/129229453