开发必会系列:为什么要用spring
Spring是于2003 年兴起的一个轻量级的Java 开发框架,开源的,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。
JavaEE 项目为何使用Spring框架?
回顾我们之前写过的程序的基本结构:
Dao、DaoImpl、Factory(其中应用到了单模式)、Service、ServiceImpl 、Action(Struts框架里的,相当于MVC的controller)等等。我们是否想过做法有哪些缺点?
使用spring前:
ServiceImpl 中用到了daoImpl 对象,那么 servieImpl 依赖于daoImpl内容, 这是一种依赖关系;Action中用到了serviceImpl,那么action依赖于serviceImpl,他们也有这种依赖关系。
另外,我们在Dao层操作数据时,hibernate 中的session创建,事务的开启和关闭, 都是我们手动在Dao层来管理的,手动调用hibernate处理事务的方法。
使用spring后:
我们可以将对象的创建以及对象之间的依赖关系、Hibernate的事务等,都由Spring框架进行操作,这样实现了程序之间的解耦、高内聚。
那这种方便具体体现在哪呢?学Spring我们需要了解几个关键的词语:
IOC:Inversion of Control(控制反转):
Ioc就是容器控制程序之间的关系,而非传统的程序代码直接控制。所谓控制反转,就是控制权由应用代码中转移到外部容器中,控制权的转移,即所谓的反转。(通俗讲:A类用到了B类中相关方法,此时A依赖于B,那么需要在A类中new实例化B,这是传统的代码控制,但是IOC描述的是控制反转,表示这种A类里面new实例化B对象的权力,不是由A操作的,而是交给Spring实例化B对象,而Spring只需要配置类和类之间依赖关系,告诉程序,A用到了B)
DI: Dependency Injection (依赖性注入):
(通俗讲:由Spring事先实例化好指定某些类,通过spring装配他们之间的依赖关系,例如:A用到B中的方法,此时spring会将实例化好的B对象,依赖注入给A,那么A就可以使用这个对象了,这个意思其实跟IOC差不多)
AOP:Aspect-Oriented Programming(面向切面编程):举个例子,比如B类调用某一个方法时,我想统计这个方法执行了多长时间,但我又懒得在程序中每一处调用B类该方法的地方,加入统计时间的代码,于是我就想,可不可以让系统自动地,在所有执行这个B类方法的地方,都调用我的统计时间的代码呢?AOP就可以。spring中,有两种实现方法,一种是针对方法名的,即:在配置类中,或者配置文件中,指明哪个方法名执行时,会触发我自定义的统计时间的方法;另一种是针对注解的,即:自定义一个注解,在你要统计时间的函数上,加上这个注解,然后在配置类中,对这个注解,定义你要执行的统计时间的代码即可。这就是切面。
ORM:对象关系映射(hibernate和ibatis框架,将我们的表,对应到vo类,或对应到配置xml文件映射表)
所以,具体的方便,就体现在Spring的核心——IOC。
IOC容器提供了Srping的基本功能,其主要组件是BeanFactory,他是工厂模式的实现,BeanFactory使用控制反转(IOC) 模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开(通俗讲:就是将要实例化的对象,由Srping框架事先完成,BeanFactory中存放的就是所有实例化好的对象)。
我们在代码里,直接用@Resource或@Autowired就能拿到这个bean,这个bean的作用域可以自己设置,有五种,如下图
最后了解一下Srping源文件包的内容:
以3.1.4为例,源文件目录结构如下:
Dist:存放Spring的核心Jar文件、
Docs:存放源码API和spring框架使用的API等;
Projects:存放spring实例;
Src:spring框架的所有源码;
开发必会系列:为什么要用spring的更多相关文章
- SSM框架开发web项目系列(五) Spring集成MyBatis
前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...
- ASP.NET MVC开发必看系列
一.关于HTTP协议的那些事 这可以说我们开发WEB程序的空气,推荐不断温故知新! HTTP协议 (一) HTTP协议详解 HTTP协议 (二) 基本认证 HTTP协议 (三) 压缩 HTTP协议 ( ...
- Springboot 系列(五)Spring Boot web 开发之静态资源和模版引擎
前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的 ...
- Spring基础知识汇总 Java开发必看
Spring简介 Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版.Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅 ...
- Visual Studio (VS IDE) 你必须知道的功能和技巧 - 【.Net必知系列】
前言 本文主要阐述一些Visual Studio开发下需要知道的少部分且比较实用的功能,也是很多人忽略的部分.一些不常用而且冷门的功能不在本文范围,当然本文的尾巴[.Net必知系列]纯属意淫,如有雷同 ...
- Java开发必会的Linux命令
Java开发必会的Linux命令 作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服务器 ...
- SSM框架开发web项目系列(二) MyBatis真正的力量
前言 上篇SSM框架环境搭建篇,演示了我们进行web开发必不可少的一些配置和准备工作,如果这方面还有疑问的地方,可以先参考上一篇“SSM框架开发web项目系列(一) 环境搭建篇”.本文主要介绍MyBa ...
- Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...
- Springboot 系列(一)Spring Boot 入门篇
注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 由于 J2EE 的开发变得笨重,繁多的配置, ...
- 朱晔和你聊Spring系列S1E1:聊聊Spring家族的几大件
朱晔和你聊Spring系列S1E1:聊聊Spring家族的几大件 [下载本文PDF进行阅读] Spring家族很庞大,从最早先出现的服务于企业级程序开发的Core.安全方面的Security.到后来的 ...
随机推荐
- Vdbench 使用说明
一. vdbench简介 vdbench是一个 I/O 工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能.它是一个免费的工具,容易使用,而且常常用于测试和基准测试. 可以使用vd ...
- 用于解析FBNeo游戏数据的Python3脚本
FBNeo在代码中存储了游戏的元数据, 其数据格式为 struct BurnDriver BurnDrvCpsStriderua = { "striderua", "st ...
- Context与Reducer
Context与Reducer Context是React提供的一种跨组件的通信方案,useContext与useReducer是在React 16.8之后提供的Hooks API,我们可以通过use ...
- Java中的包装类(wrapper class)
1.介绍 顾名思义,包装类是封装Java原始类型的对象.每个Java原始类型都有一个对应的包装类: 基本类型 包装类 boolean Boolean byte Byte short Short cha ...
- Windows xp 无法远程连接Windows Server 2008
-------------------------转载自: Windows XPSP3通过网络级身份验证方式连接Windows Server 2008远程桌面 远程桌面大大方便了大家的日常管理工作,W ...
- letcode-K个一组翻转链表(栈思想 + 递归)
题目:输入一个有序链表,每K个一组进行反转. 输入:1, 2, 3, 4, 5, 5, 6, 8, 10 K = 3 输出:3, 2, 1, 5, 5, 4, 10, 8, 6 题解 反转,那么最先想 ...
- EXPLAIN命令
EXPLAIN命令 除了以SELECT开头的查询语句,其余的DELETE.INSERT.REPLACE以及UPDATE语句前边都可以加上EXPLAIN这个词儿,用来查看这些语句的执行计划 Ty ...
- win32- 使用WM_NCPAINT在非客户区域绘制边框
#pragma comment(lib, "UxTheme") #include <windows.h> #include <uxtheme.h> LRES ...
- Go 中的反射 reflect 介绍和基本使用
一.什么是反射 在计算机科学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问.检测和修改它本身状态或行为的一种能力.用比喻来说,反射就是程序在运行的时候能够&qu ...
- 【libGDX】加载G3DJ模型
1 前言 libGDX 提供了自己的 3D 格式模型文件,称为 G3D,包含 g3dj(Json 格式)和 g3db(Binary 格式)文件,官方介绍见 → importing-blender- ...