上一章:[Spring+SpringMVC+Mybatis]框架学习笔记:前言_目录

下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI

第1章 SpringIOC概述

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

1.1 控制反转IOC

IOC(inversion of controller)是一种概念,是把我们程序中的类与类之间的依赖关系交给容器去处理,一般有两种方式(面试):

  • 依赖查找DL(dependency lookup):程序提供查找方式,交给容器去查找(相当于se中的回调函数);
  • 依赖注入DI(dependency injection):程序不提供查找方式,提供合适的构造方法或者set方法,让容器进行注入来解决依赖关系。

Spring的控制反转就是通过依赖注入来实现。

1.2 依赖

依赖:简单的说,一个类实现某个功能需要依靠另外一个类的帮助。

1.3 回顾:基于接口编程的开发方式

当一个方法有多种实现的情况下,我们一般是基于接口的方式进行编程。

简单模拟用户登录的功能,这里省略后台数据库连接部分。

1)DAO层

接口IUserDao:

package com.steven.spring.sysmanage.dao;
/**
* 用于登录验证的DAO的接口
* @author Administrator
*
*/
public interface IUserDao{
public boolean loginUser(String userName, String password);
}
//接口实现的两种方式:UserDaoImplJdbc.java和UserDaoImplOther.java
package com.steven.spring.sysmanage.dao.impl; import com.steven.spring.sysmanage.dao.IUserDao; public class UserDaoImplJdbc implements IUserDao {
public boolean loginUser(String userName, String password) {
System.out.println("这是通过JDBC进行登录验证的DAO方法");
return true;
} } package com.steven.spring.sysmanage.dao.impl; import com.steven.spring.sysmanage.dao.IUserDao; public class UserDaoImplOther implements IUserDao {
public boolean loginUser(String userName, String password) {
System.out.println("这是通过其它方式进行登录验证的DAO方法");
return true;
} }

2) 服务层

package com.steven.spring.sysmanage.service;

import com.steven.spring.sysmanage.dao.IUserDao;

/**
* 用于用户登录、增删改查的服务类
* @author Administrator
*
*/
public class UserService {
boolean flag = false; IUserDao userDao; public UserService(){ } //方式1:通过构造器的方式
public UserService(IUserDao userDao){
this.userDao = userDao;
} //方式2:通过set方式,这种方式更灵活
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
} /**
* 通过调用与数据库交互的UserDao里面的loginUser方法,判断是否验证成功
* @param userName
* @param password
* @return
*/
public boolean loginUser(String userName, String password){
flag = userDao.loginUser(userName, password);
return flag;
} }

3)测试类

package com.steven.spring.sysmgr.action;

import org.junit.Test;

import com.steven.spring.sysmgr.dao.impl.UserDaoImplJdbc;
import com.steven.spring.sysmgr.service.UserService; public class LoginTest {
@Test
public void loginUsingJava(){
//方式1:使用构造方法
// UserService userService = new UserService(new UserDaoImplOther()); //方式2:使用set方法
UserService userService = new UserService();
userService.setUserDao(new UserDaoImplJdbc()); userService.loginUser("abc", "123"); }
}

由于Java是一种编译性语言,维护时直接改编码,需要再次编译才能上线使用,这样就增大了维护的工作难度和工作量。 ----> 而更改配置文件就不需要重新编译!

1.4 依赖注入

依赖注入DI是指一个对象需要另外一个对象时,无需在代码中创建所需求对象,而是依赖于外部容器,由外部容器创建后传递给程序。

依赖注入是目前为止最好的解耦方式,因为依赖关系是依靠配置文件的方式组织在一起,而不是在程序中的硬编码。

1.5 Spring的IOC

Spring的IOC容器通过依赖注入来实现程序之间的依赖关系,达到解耦的作用。

老项目:3.2版本;新项目:4.2版本

1)Spring项目环境搭建依赖的jar包

java工程jar包放在项目根目录的libs文件夹下;web工程jar包放在WebContent/WEB-INF/libs文件夹下。

再加上junit的jar包:(注意junit4.10以后是拆分了两个包)

hamcrest-core-1.3.jar和junit-4.11.jar

再加上日志包:

junit-4.11.jar和log4j-1.2.17.jar

2)配置文件applicationContext.xml,加上bean约束

在spring-framework-4.2.1.RELEASE\docs\spring-framework-reference\html下有xsd-configuration.html文件中有初始配置。

IOC的实现原理:反射

无反射无框架,无代理无框架

在上面例子的基础上,增加spring配置xml文件,更改实现层。

1)spring配置文件applicationContext.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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 相当于Java代码中的 IUserDao userDaoImplJdbc = new UseDaoImplJdbc() -->
<bean id="userDaoImplJdbc" class="com.steven.spring.sysmanage.dao.impl.UserDaoImplJdbc"></bean> <bean id="userDaoImplOther" class="com.steven.spring.sysmanage.dao.impl.UserDaoImplOther"></bean> <bean id="userService" class="com.steven.spring.sysmanage.service.UserService">
<!-- 方式1:通过构造方法的方式注入 -->
<constructor-arg ref="userDaoImplOther"></constructor-arg> <!-- 方式2:通过set方法的方式注入,注意这里的的name的值需与set方法名后面的部分保持一致,且首字母小写-->
<property name="userDao" ref="userDaoImplOther"/>
</bean> </beans>

2)更改测试类

package com.steven.spring.sysmgr.action;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.steven.spring.sysmgr.dao.impl.UserDaoImplJdbc;
import com.steven.spring.sysmgr.service.UserService; public class LoginTest {
@Test
public void loginUsinSpring(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)ac.getBean("userService");
userService.loginUser("abc", "123");
}
}

上一章:[Spring+SpringMVC+Mybatis]框架学习笔记:前言_目录

下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI

SSM框架学习笔记_第1章_SpringIOC概述的更多相关文章

  1. Java基础及JavaWEB以及SSM框架学习笔记Xmind版

    Java基础及JavaWEB以及SSM框架学习笔记Xmind版 转行做程序员也1年多了,最近开始整理以前学习过程中记录的笔记,以及一些容易犯错的内容.现在分享给网友们.笔记共三部分. JavaSE 目 ...

  2. SSM框架学习笔记(一)

    Spring框架 Spring :是一个开源框架,起初是为解决企业应用开发的复杂性而创建的,但是现在已经不止 企业级应用开发,Spring的核心就是提供了一个轻量级的控制反转和面向切面编程. SPri ...

  3. SSM框架学习笔记

    管理部门: --Spring + SpringMVC+MyBatis 1.index.jsp--->SpringMVC(Servlet) 接受客户端的请求,读取页面的值,回传到页面 2.Myba ...

  4. phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构   pha ...

  5. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  9. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

随机推荐

  1. UVA 10641 - Barisal Stadium(DP + 几何)

    题目链接:10641 - Barisal Stadium 题意:逆时针给定n个点,在给m个灯,每一个灯有一个花费,要求最小花费使得全部边能被灯照到 思路:用向量叉积推断向量的顺逆时针关系,从而预处理出 ...

  2. Python 绘图利器 —— ggplot

    安装: 命令行:pip install ggplot 1. 杂项 NameError: name 'ggsave' is not defined. Python ggplot- ggsave func ...

  3. (015)实现一个函数来检查是否平衡树(keep it up)

    实现一个函数来检查是否平衡树.这个问题而言. 平衡指的是这棵树随意两个叶子结点到根结点的距离之差不大于1. 这个题我们能够採用暴力搜索,找到叶子节点到根节点的最小值和最大值.然后他们的差假设大于1就不 ...

  4. 升级phpstudy2018默认mysql版本到5.7

    原文:升级phpstudy2018默认mysql版本到5.7 版权声明:在那最初的相遇中,我们都曾经为彼此心动过... https://blog.csdn.net/weixin_36185028/ar ...

  5. WPF不明内存泄露已解决,白头发也没了

    原文:WPF不明内存泄露已解决,白头发也没了 在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,在上一篇中求助了一个内存泄露问题[WPF不明内存泄露原因,头发都白了几根 ...

  6. c# Ajax后台动态分页

    创建WebPager类 public static class WebPager { public static string WebPagerAjax(string Idn, bool IsShor ...

  7. Linux命令扫盲 之 sar

    今天在读<大规模Web服务开发技术>一书的时候,书中提到了sar这个命令,感觉很有用,有必要整理学习一下.(对于一位Linux初学者,不能放过任何一个学习机会 :P) 打开自己的CentO ...

  8. UWP中String类型如何转换为Windows.UI.Color

    原文:UWP中String类型如何转换为Windows.UI.Color 我在学习过程中遇到的,我保存主题色为string,但在我想让StatusBar随着主题色变化时发现没法使用. ThemeCol ...

  9. 关于 win32 下磁盘的遍历方法

    最近要写个在线专杀的东东,虽然是专杀(本来只要清除几个特定的文件和杀几个特定的进程,然后把用户的注册表恢复正常,很多病毒木马最喜欢干的一件事情就是写 映像劫持 然后机器一重启,安全相关的软件全部玩完了 ...

  10. 把滚动箱的样式做如下调整来模拟 TPanel

    程序中用 TPanel 做了容器, 需要给它一个背景图片; 发现这竟是个难题! 发现我经常使用的滚动箱控件 TScrollBox, 是一个很好的替代品. 本例需要先添加两个图片资源, 添加方法可以参考 ...