天天看点

Spring核心之对 IOC的理解

Spring核心之对 IOC的理解

               Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

一 、IOC

 IOC : Inversion of Control,中文译为“控制反转”,IOC不是一种技术,而是一种设计思想。

              Ioc意味着将设计好的对象交给容器控制,而不是传统的在对象内部直接通过new进行创建对象。

 传统的程序设计是通过new主动创建对象,然后再通过对象调用方法,类似以下代码:

1 、先创建一个接口:

  1. public interface UserDao {
  2. public void save();
  3. }

2 、创建接口的实现类:

  1. public class UserDaoImpl implements UserDao {
  2. @Override
  3. public void save() {
  4. System.out.println("save方法执行了...");
  5. }
  6. }

3、编写一个测试类:通过new主动创建对象并调用方法

  1. public class SpringDemo1 {
  2. @Test
  3. /**
  4. * 传统方式的调用
  5. */
  6. public void demo1(){
  7. UserDao userDao = new UserDaoImpl(); //创建对象
  8. userDao.save(); //通过对象调用方法
  9. }
  10. }

      这样的程序设计会导致类与类之间高耦合,一旦后期维护,程序不想通过UserDaoImpl 来实例化userDao对象,而想通过另一个实现类 UserDaoIocImpl 来实例化userDao对象 ,就需要修改源代码为 UserDao userDao = new UserDaoIocImpl();   不易于后期维护。

IOC :将设计好的对象交给容器控制,由容器帮我们创建并实例化对象 ,而我们可以通过外部xml配置文件来告诉容器我们需要哪个实现类来实例化对象 ,一旦我们需要更改实现类,则直接修改xml配置文件即可。就能够在不修改源代码的情况下,维护程序。  

首先编写一个将对象交给容器控制的程序:

1 、先创建一个接口:

  1. public interface UserDao {
  2. public void save();
  3. }

2 、创建接口的实现类: 

  1. public class UserDaoImpl implements UserDao {
  2. @Override
  3. public void save() {
  4. System.out.println("IOC容器调用的save方法执行了...");
  5. }
  6. }

 3 、创建applicationContext.xml配置文件,将实现类交给Spring管理,即告诉容器调用哪个实现类实例化对象

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <!-- 设置一个id, class为实现类的全路径,告诉容器调用这个实现类实例化对象-->
  10. <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl"></bean>
  11. </beans>

4 、编写测试类

  1. public class SpringDemo1 {
  2. @Test
  3. /**
  4. * Spring IOC容器的方式的调用
  5. */
  6. public void demo2(){
  7. // 创建Spring的工厂来加载xml配置文件
  8. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  9. //读取到我们告诉容器需要哪个实现类来实例化对象
  10. UserDao userDao = (UserDao) applicationContext.getBean("userDao"); //此处的参数为xml配置文件中 <bean>标签中id的值
  11. userDao.save();
  12. }

当我们需要将实现类UserDaoImpl更换为UserDaoIocImpl时,只需修改xml配置文件<bean>标签中 class 的路径,将其修改为UserDaoIocImpl 类的全路径即可,其余代码无需修改

<bean id="userDao" class="com.czm.spring.demo1.UserDaoIocImpl"></bean>           

二 、DI

DI :Dependency Injection,即“依赖注入” 。在IOC环境下,Spring管理的这个实现类在执行时依赖的一些属性,可直接在类          中注入,以供使用。

1 、比如 UserDaoImpl 实现类在执行时需要用到 name 属性,可直接定义 name 属性并提供 set 方法

  1. public class UserDaoImpl implements UserDao {
  2. //依赖注入
  3. private String name;
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. @Override
  8. public void save() {
  9. System.out.println("save方法执行了..."+name); //执行时直接使用注入的属性
  10. }
  11. }

  在xml配置文件中通过<property>标签为 name 属性赋值

  1. <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl">
  2. <property name="name" value="依赖注入的name属性"></property>
  3. </bean>

2 、当我们需要 调用业务层 Service 方法时 也可注入Service  ,前提是在IOC环境下,即Service实现类也交给了Spring 管理了

Spring核心之对 IOC的理解

 注入Service,提供 set 方法

  1. //注入Service
  2. private UserService userService;
  3. //提供Set方法
  4. public void setUserService(UserService userService) {
  5. this.userService = userService;
  6. }

在xml配置文件中通过<property>标签来配置Service ,name 和 ref 属性值与配置Service 是 id 值相同

Spring核心之对 IOC的理解

 可直接调用Service 方法

  1. public String regist(){
  2. userService.regist(user); //调用依赖注入的Service方法
  3. return LOGIN;
  4. }

继续阅读