zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    

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

    • 常规流程的控制,程序相互的调用由代码控制
    • 控制反转把控制权交给用户,也就是由配置文件管理,程序本身不创建对象,变成被动接受
  • 相关阅读:
    CodeForces 757C Felicity is Coming!(排列组合)
    Ural 1519 Formula 1( 插头dp )
    FZU 2187 回家种地 ( 扫描线 + 离散 求矩阵单次覆盖面积 )
    HDU 1255 覆盖的面积 ( 扫描线 + 离散 求矩阵大于k次面积并 )
    ZOJ 3841 Cards
    HDU 4012 Paint on a Wall(状压+bfs)
    Topcoder SRM653div2
    2015 GDUT校赛
    Topcoder SRM652div2
    CodeChef A String Game(SG)
  • 原文地址:https://www.cnblogs.com/honzhez/p/13418219.html
Copyright © 2011-2022 走看看