• 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();
        }
    }
    

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

    • 常规流程的控制,程序相互的调用由代码控制
    • 控制反转把控制权交给用户,也就是由配置文件管理,程序本身不创建对象,变成被动接受
  • 相关阅读:
    Web 自动化测试(Selenium)认识
    windows 环境下 Tomcat 使用以及Jenkins 监听项目
    ant 环境配置以及 build.xml 文件解析
    requests + pytest + allure 结合使用并生成测试报告
    requests 接口测试
    allure 结合 pytest 生成测试报告
    测试报告——allure框架
    单元测试 pytest 文件读取(CSV, XML)
    单元测试 pytest 模块
    Java中把一个对象复制给另外一个对象引发的思考
  • 原文地址:https://www.cnblogs.com/honzhez/p/13418219.html
Copyright © 2020-2023  润新知