• Java控制反转


    概述

    本文基于示例的方式解释控制反转,再看控制反转之前,我们先看下常规控制流程,以数据库访问为例

    示例并没有实际访问数据,而是基于service和dao,模拟请求数据

    创建项目

    注意:本实例基于Idea开发工具

    • 打开创建项目选项(New Project),选择Maven,不要选择“Create from crchetype”,点击Next
    • GroupID:com.example和ArtifactID:Demo,点击Next和Finish
    • 新生成的项目目录结构如下:
      • src
        • main
          • java
          • resources
        • test
        • pom.xml

    常规流程

    • main.java下面添加Package:com.example.dao
    • dao下面添加访问接口,同时添加两种数据访问方式:
    public interface UserDao {
        String getUser();
    }
    public class UserDaoMSSqlImpl implements UserDao {
        public String getUser() {
            return "从SQL Server查询用户";
        }
    }
    public class UserDaoMySqlImpl implements UserDao {
        public String getUser() {
            return "从MySQL查询用户";
        }
    }
    
    • 添加服务层
    • main.java下面添加Package:com.example.service
    • 添加访问类
    public interface UserService {
        void getUser();
    }
    public class UserServiceImpl implements  UserService {
        // 如果想更换数据库,这个地方需要改一下
        private UserDao  userDao = new UserDaoMSSqlImpl();
    
        public void getUser() {
            System.out.println(userDao.getUser());
        }
    }
    
    • 添加测试,在src.test下面添加UserTest
    public class UserTest {
        public static void main(String[] args) {
            UserService userService = new UserServiceImpl();
            userService.getUser();
        }
    }
    

    从上面的例子中看到,如果想更改数据连接,必须修改代码,也就是service类中,更新dao的初始化

    控制反转流程

    • 项目pom.xml文件添加MVC依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
    </dependencies>
    
    • resources添加配置文件services.xml
    <?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="mssqlImpl" class="com.example.dao.UserDaoMSSqlImpl"></bean>
        <bean id="mysqlImpl" class="com.example.dao.UserDaoMySqlImpl"></bean>
    
        <bean id="userServiceImpl" class="com.example.service.UserServiceImpl">
            <!-- 更新ref:mssqlImpl或mysqlImpl,即可实现数据库切换 -->
            <property name="userDao" ref="mysqlImpl"></property>
        </bean>
    </beans>
    
    • 改写UserServiceImpl类
    public class UserServiceImpl implements  UserService {
        private UserDao  userDao;
    
        public void getUser() {
            System.out.println(userDao.getUser());
        }
    
        // 程序被动接受入口,依赖注入就是利用set方法注入
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    }
    
    • 改写测试类型
    public class UserTest {
        public static void main(String[] args) {
            // 获取Spring上下文对象
            ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");
            UserService userService1 = (UserService)context.getBean("userServiceImpl");
            userService1.getUser();
        }
    }
    

    从上面两个示例里面看出:

    • 常规流程的控制,程序相互的调用由代码控制
    • 控制反转把控制权交给用户,也就是由配置文件管理,程序本身不创建对象,变成被动接受
  • 相关阅读:
    推荐一款国内首个开源全链路压测平台
    面试必备:接口自动化测试精选面试干货!
    测试开发:你所需要掌握了解的性能测试知识
    推荐一款自动化测试神器,不会写代码也能做!
    测试开发进阶:一文教你从0到1搞懂大数据测试!
    Java 在PPT中插入OLE对象
    Java 在Word中创建多级项目符号列表和编号列表
    C# / vb.net 给PDF 添加可视化和不可见数字签名
    Java 给Word添加印章
    Java 加载、操作和保存WPS文字文档
  • 原文地址:https://www.cnblogs.com/honzhez/p/13418219.html
Copyright © 2020-2023  润新知