关于java:Spring-IOC控制反转

5次阅读

共计 2817 个字符,预计需要花费 8 分钟才能阅读完成。

管制反转 IOC(Inversion of Control)

代码构造

// mapper
public interface UserDao {String getUser();
}
//mapper 实现 张三
public class UserDaoImpl implements UserDao {
    @Override
    public String getUser() {return "张三 22 岁";}
}
//mapper 实现 李四
public class UserDao2Impl implements UserDao {
    @Override
    public String getUser() {return "李四 22 岁";}
}
//service
public interface UserService {String getUser();
}

一般对象注入 (service 的实现)

// 实现
public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoImpl();
    @Override
    public String getUser() {return userDao.getUser();
    }
}
// 调用
public class UserTest {public static void main(String[] args) {UserService userService = new UserServiceImpl();
        System.out.println(userService.getUser());
    }
}

引入 UserDaoImpl 让其获取张三信息

看上述代码 此时咱们的测试类获取的是张三的信息。如果须要获取李四的信息须要 批改引入的对象为 private UserDao userDao = new UserDao2Impl();

此时对象的创立势力在程序员的手中。如果用户的要求有扭转须要批改源代码。

set 形式对象注入

// 实现
public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao){this.userDao = userDao;}
    @Override
    public String getUser() {return userDao.getUser();
    }
}
// 调用
public class UserTest {public static void main(String[] args) {UserService userService = new UserServiceImpl();
        ((UserServiceImpl) userService).setUserDao(new UserDao2Impl());
        System.out.println(userService.getUser());
    }
}

通过 set 让用户本人抉择须要创立的对象类型, 将创建对象的势力交给用户本人, 不须要批改源代码。

此时程序自身由被动的创建对象到被动的接管对象。零碎的耦合性升高了, 能够更加关怀业务的实现。

所以说 IOC 其实只是一种思维 ,这就是所谓的管制反转。

Spring 治理

service 实现类:

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao){this.userDao = userDao;}
    private UserDao userDao1;
    public void setUserDao1(UserDao userDao1){this.userDao1 = userDao1;}
    @Override
    public String getUser() {return userDao.getUser();
    }
    @Override
    public String getUser1() {return userDao1.getUser();
    }
}

名为 beans.xml 的文件, 放于资源文件 resources 下边:

<?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">
<!-- id 指的是标识单个 bean 的字符串
     class 指的是 bean 对象的门路
-->
    <bean id="userDaoZs" class="com.spring.daoimpl.UserDaoImpl">
    </bean>
    <bean id="userDaoLs" class="com.spring.daoimpl.UserDao2Impl">
    </bean>
    <!-- 控制器调用 setAxe 办法,将容器中的 axe bean 作为传入的参数 -->

<!--    value: 根本数据类型
        ref: spring 曾经创立的对象
        上述两个指 bean 配置文件中的 bean 名称
        name 是决定 UserService 类中的那个参数 (此时传递是 userDao, 如果是 userDao1)
-->
    <bean id="userService" class="com.spring.serviceimpl.UserServiceImpl">
        <property name="userDao1" ref="userDaoZs"></property>
        <property name="userDao" ref="userDaoLs"></property>
    </bean>
</beans>

调用类:

public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService = (UserService) context.getBean("userService");
        System.out.println(userService.getUser());// 李四
        System.out.println(userService.getUser1());// 张三
    }
}

此时对象的创立, 治理, 拆卸全副交给了 Spring 去治理。如果用户有须要能够通过更该配置文件的形式去批改而不须要去批改源代码。

正文完
 0