概述
本文基于示例的方式解释控制反转,再看控制反转之前,我们先看下常规控制流程,以数据库访问为例
示例并没有实际访问数据,而是基于service和dao,模拟请求数据
创建项目
注意:本实例基于Idea开发工具
打开创建项目选项(New Project),选择Maven,不要选择“Create from crchetype”,点击Next
GroupID:com.example和ArtifactID:Demo,点击Next和Finish
新生成的项目目录结构如下:
常规流程
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(); } }
从上面两个示例里面看出:
常规流程的控制,程序相互的调用由代码控制
控制反转把控制权交给用户,也就是由配置文件管理,程序本身不创建对象,变成被动接受
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
问题内容: java中如何实现访问控制,public, protected, default和private关键字有何区别? 问题答案:
...Spring implements a controller in a very abstract way, which enables you to create a wide variety of controllers. 控制器作为应用程序逻辑的处理入口,它会负责去调用你已经实现的一些服务。通常,一个控制器会接收并解析用户的请求,然后把它转换成一个模型交给视图,由视图渲染出页面最终呈现
1. 前言 通过第一章第二小节,我们已经可以使用 Spring 框架实现对自定义的 Java 对象管理,由 Spring 框架加载对象,实例化对象,放入容器。其实这就是 Spirng 的核心功能之 IoC,那么什么是 IoC 呢?什么又是容器呢? 跟我来,一步步揭开他们的神秘面纱。 2. 什么是 IoC? 来自百度百科的解释 —— 控制反转(IoC): (Inversion of Control,
问题内容: 第一次遇到控制反转(IoC)时可能会造成很大的混乱。 它是什么? 它解决什么问题? 什么时候合适,什么时候不合适? 问题答案: 控制反转(IoC)和依赖注入(DI)模式都是关于从代码中删除依赖的。 例如,假设您的应用程序具有文本编辑器组件,而您想提供拼写检查。您的标准代码如下所示: 我们在这里所做的创建了和之间的依赖关系。在IoC场景中,我们改为执行以下操作: 在第一个代码示例中,我们
本文向大家介绍winform 实现控制输入法,包括了winform 实现控制输入法的使用技巧和注意事项,需要的朋友参考一下 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方便以后查找 开始正文 1、先介绍本文会用到的windows的API,网上有很详细的资料,我这里就只简要说明一下 ImmGetContext(IntPtr hwnd):获取当前正在输入的
本文向大家介绍如何实现广告弹窗触达频率的控制?,包括了如何实现广告弹窗触达频率的控制?的使用技巧和注意事项,需要的朋友参考一下 如何实现广告弹窗触达频率的控制? 今天我们聊聊实际工作中遇到的一个问题: 产品提出想在我们的产品的首页做个弹窗广告,但是又不希望用户每次进来都给用户弹窗,每个用户每天进来只弹一次就好了。 这个如何实现? 方法一(暴力破解) 或许有些人会觉得这个挺简单的,这个问题抽象出来不
本文向大家介绍Django REST framework 如何实现内置访问频率控制,包括了Django REST framework 如何实现内置访问频率控制的使用技巧和注意事项,需要的朋友参考一下 对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率。 可以配置redis 匿名用户的访问频率限制,这里设置在全站下,如下: 登录用户的访问频率设置在单独的视图中,而视图依赖身份认
问题内容: 首先,我是PHP的初学者。并在此处发布了一个问题:在项目中重构require_once文件。我试图尽我所能地阅读有关Front控制器的信息,但是却无法了解它的工作原理甚至是全部。 有人可以简要解释一下它是如何工作的,以及所有内容吗? 谢谢。 问题答案: FrontController指的是一种设计模式,其中应用程序中的单个组件负责处理对应用程序其他部分的所有请求。它集中了其余应用程序所