- 浏览: 134083 次
文章分类
最新评论
-
wangyudong:
很有帮助的代码实例,测试Spring Boot REST AP ...
1、springboot入门案例helloworld与集成hibernate -
wangyudong:
学习了,的确是一个非常好的Spring boot实例,很快就写 ...
1、springboot入门案例helloworld与集成hibernate
学习Spring之前,首先要了解的是Spring存在的意义及它的使命。
Spring最根本的使命----简化Java开发。
什么是spring框架
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。
Spring存在原因即它简化和java开发,为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程。
2、通过依赖注入和面向接口实现松耦合。
3、基于切面和惯例进行声明式编程。
4、通过切面和模板减少样板式代码。
1、轻量级和最小侵入性的POJO
很多框架通过强迫应用继承它们的类工实现它们的接口从而让应用跟框架绑死。在Spring普及之前,常用的框架有EJB。典型的例子即,EJB2的无状态会话Bean,Java bean实现SessionBean接口,它强迫你参与EJB的生命周期。使得JavaBean很大一部分多余代码为使用EJB而编写。
使用Spring,JavaBean不需要实现、继承或者导入与Spring API相关的任何东西。Spring通过依赖注入来装配POJO,使应用对象彼此之间保持松散耦合。
2、通过依赖注入和面向接口实现松耦合
任何一个有实现意义的应用都是由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。通常,每个对象负责管理与自己相互协作的对象的引用,这将会导致
高度耦合和难以测试的代码。
我们以骑士(Knight)执行探险任务(Quest)为例,如拯救少女,击杀恶龙.....等。
依照通常方式进行开发,代码将为如下:
如上所见,DamselRescuingKinght在它的构造函数中自行创建了RescuingDamselQuest。这使得RescuingDamselQuest和DamselRescuingKinght紧密的耦合到了一起,因此极大的限制了骑士执行探险的能力。使得该骑士只能执行救援少女任务,如果要执行击杀恶龙,该骑士将无法执行。另一方面DamselRescuingKinght该类的单元测试的代码将难以编写,并且该代码将难以复用。
使用Spring依赖注入以及面向接口使用应用对象之间依赖关系实现松耦合。对象的依赖关系将由负责协调系统中各个对象的第三方组件在创建对象时设定。无需自行创建或管理它们的依赖关系即----依赖关系将被自动注入到需要它们的对象中去。
使用Spring的构造器注入
根据以上代码:Spring通过应用上下文装载Bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。
使用成员注入及注解方式实现另一种探险任务
3、基于切面和惯例进行声明式编程。
AOP编程允许把遍布应用各处的功能分离出来形成可重用的组件。
面向切面编程往往被定义为促使应用程序分离关注点的一项技术。系统由许多不同组件组成,每一个组件各负责一块特定功能,除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理、安全此类的系统服务经常融入到有自身核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们总是跨越系统的多个组件。
如果将这些关注点分散到多个组件中去,代码将会:
(1)实现关注点代码将会重复出现在多个组件中。
(2)使得组件本身的核心业务因无关代码而变得混乱。
AOP使用得这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。结果使用这些组件具有高内聚以及更加关注自身业务,总之,AOP确保POJO保持简单。
继承以骑士执行探险任务为例,添加一个吟游诗人歌唱骑士的事迹
如上所示,Minstrel有两个方法一个在执行任务之前执行,一个在执行任务之后执行。
将它加入骑士类中:
如上代码可以实现需要的效果,但是管理他的吟游诗人是骑士的职责吗?这应该是吟游诗人自己的事,不应该要骑士提醒吟游诗人去做他的事。
另外这样使得骑士必须知道吟游诗人,使得骑士BraveKnight 的代码复杂化了。
使用AOP实现声明编程
将Minstrel抽象为一个切面,你所做的事情只是在一个Spring配置文件中声明它。
4、通过切面和模板减少样板式代码
如常见的样板式代码范例JDBC访问数据库查询,再如JMS、JNDI、使用REST服务通常也会涉及大量重复代码。
Spring旨在通过模板封装来消除样板式代码。
Spring最根本的使命----简化Java开发。
什么是spring框架
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。
Spring存在原因即它简化和java开发,为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程。
2、通过依赖注入和面向接口实现松耦合。
3、基于切面和惯例进行声明式编程。
4、通过切面和模板减少样板式代码。
1、轻量级和最小侵入性的POJO
很多框架通过强迫应用继承它们的类工实现它们的接口从而让应用跟框架绑死。在Spring普及之前,常用的框架有EJB。典型的例子即,EJB2的无状态会话Bean,Java bean实现SessionBean接口,它强迫你参与EJB的生命周期。使得JavaBean很大一部分多余代码为使用EJB而编写。
使用Spring,JavaBean不需要实现、继承或者导入与Spring API相关的任何东西。Spring通过依赖注入来装配POJO,使应用对象彼此之间保持松散耦合。
2、通过依赖注入和面向接口实现松耦合
任何一个有实现意义的应用都是由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。通常,每个对象负责管理与自己相互协作的对象的引用,这将会导致
高度耦合和难以测试的代码。
我们以骑士(Knight)执行探险任务(Quest)为例,如拯救少女,击杀恶龙.....等。
依照通常方式进行开发,代码将为如下:
/* * 拯救少女 */ public class DamselRescuingKinght { private RescuingDamselQuest quest ; //拯救少女任务 public DamselRescuingKinght() { this.quest = new RescuingDamselQuest(); } public void embarkOnQuest(){ quest.embark(); } } class RescuingDamselQuest{ public void embark(){ System.out.println("执行任务!"); } }
如上所见,DamselRescuingKinght在它的构造函数中自行创建了RescuingDamselQuest。这使得RescuingDamselQuest和DamselRescuingKinght紧密的耦合到了一起,因此极大的限制了骑士执行探险的能力。使得该骑士只能执行救援少女任务,如果要执行击杀恶龙,该骑士将无法执行。另一方面DamselRescuingKinght该类的单元测试的代码将难以编写,并且该代码将难以复用。
使用Spring依赖注入以及面向接口使用应用对象之间依赖关系实现松耦合。对象的依赖关系将由负责协调系统中各个对象的第三方组件在创建对象时设定。无需自行创建或管理它们的依赖关系即----依赖关系将被自动注入到需要它们的对象中去。
使用Spring的构造器注入
所必须包: spring-beans-3.2.0.RELEASE spring-context-3.2.0.RELEASE.jar spring-core-3.2.0.RELEASE.jar spring-expression-3.2.0.RELEASE.jar commons-logging-1.1.1.jar knight.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-3.0.xsd "> <bean id="knight" class="com.demo.BraveKnight"> <constructor-arg ref="quest1"></constructor-arg> </bean> <bean id="quest1" class="com.demo.RescuingDamselQuest" /> </beans> public interface Knight { public void embarkOnQuest(); } public interface Quest { public void embark(); } /* * 执行各种任务的骑士 */ public class BraveKnight implements Knight{ private Quest quest ; public BraveKnight(Quest quest){ this.quest = quest; } public void embarkOnQuest(){ quest.embark(); } } /* * 拯救少女任务 */ public class RescuingDamselQuest implements Quest{ public void embark(){ System.out.println("RescuingDamsel Go...."); } } /* 测试 */ public class KnightMain { public static void main(String[] args) { ApplicationContext apx = new ClassPathXmlApplicationContext("knight.xml"); //加载spring上下文 Knight knight1 = (Knight) apx.getBean("knight"); //获取bean knight1.embarkOnQuest(); //使用bean } }
根据以上代码:Spring通过应用上下文装载Bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。
使用成员注入及注解方式实现另一种探险任务
<?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-3.0.xsd " default-autowire="byName"> <bean id="knight" class="com.demo.BraveKnight" /> <bean id="quest" class="com.demo.SlayDragonQuest"/> </beans> /* * 执行各种任务的骑士 */ public class BraveKnight implements Knight{ @Autowired private Quest quest ; public void embarkOnQuest(){ quest.embark(); } public void setQuest(Quest quest) { this.quest = quest; } } /* * 击杀恶龙任务 */ public class SlayDragonQuest implements Quest{ public void embark() { System.out.println("SlayDragon Go...."); } }
3、基于切面和惯例进行声明式编程。
AOP编程允许把遍布应用各处的功能分离出来形成可重用的组件。
面向切面编程往往被定义为促使应用程序分离关注点的一项技术。系统由许多不同组件组成,每一个组件各负责一块特定功能,除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理、安全此类的系统服务经常融入到有自身核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们总是跨越系统的多个组件。
如果将这些关注点分散到多个组件中去,代码将会:
(1)实现关注点代码将会重复出现在多个组件中。
(2)使得组件本身的核心业务因无关代码而变得混乱。
AOP使用得这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。结果使用这些组件具有高内聚以及更加关注自身业务,总之,AOP确保POJO保持简单。
继承以骑士执行探险任务为例,添加一个吟游诗人歌唱骑士的事迹
/* 吟游诗人 */ public class Minstrel { public void singBeforeQuest(){ System.out.println("before ---knight is so brave!"); //探险任务之前执行 } public void singAfterQuest(){ System.out.println("after ----knight did embark on a quest!"); //探险任务之后执行 } }
如上所示,Minstrel有两个方法一个在执行任务之前执行,一个在执行任务之后执行。
将它加入骑士类中:
<?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-3.0.xsd " default-autowire="byName"> <bean id="knight" class="com.demo.BraveKnight" /> <bean id="quest" class="com.demo.SlayDragonQuest"/> <bean id="minstrel" class="com.demo.Minstrel" /> </beans> /* * 执行各种任务的骑士 */ public class BraveKnight implements Knight{ @Autowired private Quest quest ; @Autowired private Minstrel minstrel; public void embarkOnQuest(){ minstrel.singBeforeQuest(); quest.embark(); minstrel.singAfterQuest(); } public void setQuest(Quest quest) { this.quest = quest; } public void setMinstrel(Minstrel minstrel){ this.minstrel = minstrel; } }
如上代码可以实现需要的效果,但是管理他的吟游诗人是骑士的职责吗?这应该是吟游诗人自己的事,不应该要骑士提醒吟游诗人去做他的事。
另外这样使得骑士必须知道吟游诗人,使得骑士BraveKnight 的代码复杂化了。
使用AOP实现声明编程
将Minstrel抽象为一个切面,你所做的事情只是在一个Spring配置文件中声明它。
aop必须包 aopalliance-1.0.jar aspectjweaver-1.8.7.jar spring-aop-3.2.0.RELEASE.jar spring-aspects-3.2.0.RELEASE.jar spring-beans-3.2.0.RELEASE spring-context-3.2.0.RELEASE.jar spring-core-3.2.0.RELEASE.jar spring-expression-3.2.0.RELEASE.jar commons-logging-1.1.1.jar <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd " default-autowire="byName"> <bean id="knight" class="com.demo.BraveKnight" /> <bean id="quest" class="com.demo.SlayDragonQuest"/> <bean id="minstrel" class="com.demo.Minstrel" /> <!-- 声明 --> <aop:config> <aop:aspect ref="minstrel"> <aop:pointcut id="embark" expression="execution(* *.embarkOnQuest(..))" /> <!-- 定义切面 --> <aop:before pointcut-ref="embark" method="singBeforeQuest"/> <!-- 声明前置通知 --> <aop:after pointcut-ref="embark" method="singAfterQuest"/> <!-- 声明后置通知 --> </aop:aspect> </aop:config> </beans> import org.springframework.beans.factory.annotation.Autowired; /* * 执行各种任务的骑士 */ public class BraveKnight implements Knight{ @Autowired private Quest quest ; public void embarkOnQuest(){ quest.embark(); } public void setQuest(Quest quest) { this.quest = quest; } } //...其它不变
4、通过切面和模板减少样板式代码
如常见的样板式代码范例JDBC访问数据库查询,再如JMS、JNDI、使用REST服务通常也会涉及大量重复代码。
Spring旨在通过模板封装来消除样板式代码。
发表评论
-
spring data jpa简单案例
2016-03-29 10:16 634pom.xml <project xmlns=&qu ... -
mybatis入门示例传智燕青讲解二----高级映射和二级缓存及整合spring及反向工程
2016-03-15 10:00 778二级缓存及高级映射 sqlMapConfig.xml &l ... -
mybatis入门示例传智燕青讲解一
2016-03-11 15:51 2041示例一:增删改查 sqlMap ... -
mybatis入门案例
2016-03-10 14:41 459sqlMapConfiger.xml <?xml v ... -
spring3+mybatis整合案例
2016-02-19 11:21 644pom.xml <project xmlns=&qu ... -
hibernate一对一,一对多,多对一,多对多注解实现案例
2016-02-18 11:01 783pom.xml <project xmlns=&qu ... -
springmvc+hibernate4搭建案例
2016-02-17 09:58 839pom.xml <project xmlns=&qu ... -
hibernate和mybatis比较
2016-01-07 15:13 1178Hibernate简介 Hibernate对数据库结构提供了较 ... -
mybaits简述及原理概述
2016-01-07 11:40 2976Mybatis是一个基于Java的持久层框架。 MyBati ... -
hibernate基本原理
2016-01-04 17:38 2945hibernate是一个基于ORM的持久化框架。它是对jdbc ... -
springmvc与struts2比较
2015-12-30 17:31 788springmvc与struts2比较 1、springmvc ... -
Struts2简述及工作原理
2015-12-30 11:14 10246Struts2是实现MVC(Model-View-Contro ... -
springmvc学习总结01---简述及原理模型
2015-12-28 17:38 13431、用户发起request请求至控制器(Controlle ... -
spring3.0.7中各个jar包的作用总结
2015-12-28 09:25 884org.springframework.context-3.0 ... -
springmvc非注解方式
2015-11-05 21:36 808springmvc 模型原理 springmvc. ...
相关推荐
Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programmaing:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务...
一共近百道题与完整答案Spring框架的优点都有什么?简述你对 IoC(Inversion of Control)的理解。spring 中的BeanFactory与ApplicationContext的作用和区别?Spring如何实现资源管理?如何在web应用里面配置spring?...
SSM框架集成,其中包括SpringMVC+Spring+Mybatis。 复习了下之前框架方面的知识,这次独立自己查看文档,搜百度将SpringMVC+Spring+Mybatis集成了。 这次集成版本是建Dynamic web Project,然后手动添加jar文件,...
17.1.1 整合思路 由于Spring MVC是Spring框架中的一个模块,所以Spring MVC与Spring之间不存在整合的问题,只要引入相应JAR包就可以直接使用。因此SSM框架的整合就只涉及到了Spring与MyBatis的整合,以及Spring MVC...
本项目是一款基于SSM(Spring、SpringMVC、MyBatis)框架开发的Java开源线上商城。该商城项目融合了前沿的Web技术,致力于为用户提供便捷、流畅的在线购物体验。 技术栈: - 主要编程语言:Java - 其他涉及语言:...
项目标题:基于SSM框架的在线订餐管理系统源码 ...项目结构清晰,简洁而不失功能完整,非常适合初学者作为Java项目入门的学习案例,同时也是企业级Java开发人员熟悉经典SSM框架应用的优质实践资源。
本项目是一个集成了SSM(Spring、SpringMVC、MyBatis)框架的高效增删改查功能实现。它主要以Java语言开发,辅以CSS和JavaScript进行页面渲染和交互。 技术细节: - 文件总数:共49个文件 - Java源文件:14个,...
一、项目简述 本系统功能包括:springboot+springmvc+mybatis的流浪 猫救助系统,后台分为普通用户可管理员用,包括注册, 登录,流浪猫发布,评论,分享,后台管理,用户管理, 热门文章赞助等等功能,非常不错,...
重点介绍了基于J2EE架构的博客网站设计方案,实现的...系统如何以Spring 框架为核心,向下整合Hibernate进行持久层访问,向上整合Struts 按清晰的MVC 模式控制,怎样划分应用的层次。简述了页面的请求的分发及流程。
后台框架: SSM(SpringMVC + Spring + Mybatis) 登录/注册:住户账号注册和登录 用户信息进行水电使用查询和在线缴费 维护服务:上传维护需求(图片+文字说明)端 监督投诉服务:上传违规现象(图片+文字说明) ...
C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件...
spring框架,提供web容器三种,tomcat(默认)、jetty、undertow,我使用的是undertow gradle 一种基于maven或者ant的打包工具 bootstrap 前端框架,封装了很多css+js的功能组件,插件丰富 三、java相关 eclipse如...
作者: 小傅哥,Java Developer,,学习链接:赏个鸡腿:poultry_leg:一、简述服务端同样使用Netty4.x作为socket的通信框架,同时在服务端使用Layui作为管理后台的页面,并且我们的服务端采用偏向于DDD领域驱动设计的...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
18 7.2.2 数据库表之间的关系设计 19 8 程序效果展示 20 8.1 前台功能模块 20 8.2 后台功能模块 22 9 实习总结体会 27 实习内容简述 1 实习期间完成的学习内容: 1 Java Web、JSP技术和MVC框架: Java技术是Sun公司...
## 后台框架: SSM(SpringMVC + Spring + Mybatis) 登录/注册:住户账号注册和登录 用户信息进行水电使用查询和在线缴费 维护服务:上传维护需求(图片+文字说明)端 监督投诉服务:上传违规现象(图片+文字说明...