spring框架的一些技术总结

  纵观现在互联网行业,java的地位依然不可动摇,因为java拥有着的众多开发人员和适用性广,技术与解决技术大部分开源等特点,因此java依然是众多众多开发行业作为互联网开发的首选,而说到开发,我们就不等不说一下近年来最火爆的那些开源框架!

  首先我们来看一下那些曾经以及现在仍然火爆的框架有哪些:

  注:因为今天主要目的是讲解Spring,所以其他框架就先不详细讲解了,我改天会单开个框架专栏给大家讲解

  传统行业:

      SSH(Spring,Struts2,Hibernate)

    作为传统行业的经典,可以说SSH框架组合现在还有很多互联网行业在用到,当然,之所以还在用,是因为有很多传统项目并没有下架,所有说很多互联网行业依然需要程序员来对这些传统业务进行维护,那么作为学习java的我们,就必然要对这个框架有所了解和应用!

  进阶版:

      SSJ(Spring,Struts2,Spring Data JPA)

    之所以说这个SSJ的框架组合是SSH的进阶版是因为它的持久城框架从hibernate换为了Spring Data JPA,而Spring Data JPA实际上是Spring基于hibernate开发的一个JPA框架,目的是简化持久层代码,dao层只需要定义接口即可,也就是持久层面向接口开发

    它归属于阿帕奇公司的一个叫做Spring Data的项目,而Spring Data的目的则是为了简化构建基于 Spring 框架应用的数据访问技术,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。换句话说就是阿帕奇公司希望用Spring Data统一市面上所有的持久层框架(野心很大的说)。

    至于为什么说这个还仅是进阶版,是因为Struts2的存在,Struts2确实层经风靡一时,优点众多,但可惜自从业内频繁爆出Struts2存在着严重的安全漏洞,有着数据丢失容易被攻击的消息,而且京东曾因此遭受重大损失后,就慢慢的让出了业务层一哥的位置,而京东的痛下决心替换Struts2的行为,更是加速了Struts2的没落,而改由更棒的Spring MVC所替代。

  新兴互联网行业:

    SSM(Spring MVC,Spring,MyBatis)

    SSM框架依然都是由Apache公司提供的开源,免费的框架,具有着轻量级,依赖关系解耦,面向接口,程序稳定等优良特点。

  纵观传统和新兴,我们能发现,一直有一个身影在其中,而它就是Spring,一款由Apache公司推出,Rod Johnson(spring之父)开发的优秀的免费轻量级开源框架。下面就让我们一起来了解一下。

Spring简介

  Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。

Spring的优势

  方便解耦,简化开发

    通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

  AOP编程的支持

    通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

  声明式事务的支持

    可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。

  方便程序的测试

    可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。

  方便集成各种优秀框架

    Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。

  降低JavaEE API的使用难度

    Spring对JavaEE API(如JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低。

  Java源码是经典学习范例

    Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。它的源代码无意是Java技术的最佳实践的范例。

Spring的体系结构

  

    

spring的开发包

  官网:http://spring.io/

  下载地址:

  http://repo.springsource.org/libs-release-local/org/springframework/spring

  解压:(Spring目录结构:)

  * docs :API和开发规范.

  * libs :jar包和源码.

  * schema :约束.

  

之前我们说了spring的重多优点,而这些优点是由Spring提供的几个强化功能实现的,而这几个功能也是Spring的极大亮点,需要我们关注,因为这些亮点几乎是我们作为程序员所应知应会的,下面我们就来看看这几个亮点分别是什么:

   控制反转 - - IOC(方便解耦)

  依赖注入 - - DI

  切面编程 - - AOP

 控制反转:

  

  说道控制反转的解耦型,我们就需要知道一个问题,即什么是程序的耦合性?

   什么是程序的耦合

    我们在开发中,会写很多的类,而有些类之间不可避免的产生依赖关系,这种依赖关系称之为耦合。

    有些依赖关系是必须的,有些依赖关系可以通过优化代码来解除的。请看下面的示例代码:

/**
 * 客户的业务层实现类
 * @author zhy
 */

public class CustomerServiceImpl implements ICustomerService {

private ICustomerDao customerDao = new CustomerDaoImpl();
}

   上面的代码表示:业务层调用持久层,并且此时业务层在依赖持久层的接口和实现类。如果此时没有持久层实现类,编译将不能通过。这种依赖关系就是我们可以通过优化代码解决的。

再比如:

   下面的代码中,我们的类依赖了MySQL的具体驱动类,如果这时候更换了数据库品牌,我们需要改源码来修改数据库驱动。这显然不是我们想要的。

public class JdbcDemo1 {
    /**
     * JDBC操作数据库的基本入门中存在什么问题?
     *       导致驱动注册两次是个问题,但不是严重的。
     *       严重的问题:是当前类和mysql的驱动类有很强的依赖关系。
     *                  当我们没有驱动类的时候,连编译都不让。
     * 那这种依赖关系,就叫做程序的耦合
     *
     * 我们在开发中,理想的状态应该是:
     *       我们应该尽力达到的:编译时不依赖,运行时才依赖。
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        //3.获取预处理sql语句对象
        //4.获取结果集
        //5.遍历结果集
    }
}

   解决程序耦合的思路

    当是我们讲解jdbc时,是通过反射来注册驱动的,代码如下:

      Class.forName("com.mysql.jdbc.Driver");

    这时的好处是,我们的类中不再依赖具体的驱动类,此时就算删除mysql的驱动jar包,依然可以编译。但是因为没有驱动类,所以不能运行。

    不过,此处也有个问题,就是我们反射类对象的全限定类名字符串是在java类中写死的,一旦要改还是要修改源码。

    解决这个问题也很简单,使用配置文件配置。

  工厂模式解耦

    在实际开发中我们可以把所有的dao和service和action对象使用配置文件配置起来,当启动服务器应用加载的时候,通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。

  控制反转-Inversion Of Control

    上面解耦的思路有2个问题:

   1、存哪去?

    分析:由于我们是很多对象,肯定要找个集合来存。这时候有Map和List供选择。  到底选Map还是List就看我们有没有查找需求。有查找需求,选Map。

    所以我们的答案就是:

      在应用加载时,创建一个Map,用于存放action,Service和dao对象。

      我们把这个map称之为容器

    2、还是没解释什么是工厂?

      工厂就是负责给我们从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。

    原来:

       我们在获取对象时,都是采用new的方式。是主动的。

    现在:

        我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。

    这种被动接收的方式获取对象的思想就是控制反转,它是spring框架的核心之一。

    它的作用只有一个:削减计算机程序的耦合。

  学习了上面的控制反转,我们得出了一个结论:Spring是利用工厂模式的形式完成了解耦!使我们从原来的主动调用者,变为了被动的获取者的转变。(一些面试时常问这个问题)

Spring的依赖注入

  依赖注入的概念

    它是spring框架核心ioc的具体实现方式。简单的说,就是坐等框架把对象传入,而不用我们自己去获取。从此,当我们需要用到一个对象时,只需从从spring容器中获取即可(前提是你事先把那个对象交给了spring容器管理,即在xml中事先配置)

  依赖注入的两种方式:构造函数注入和set方法注入

  1 构造函数注入

    顾名思义,就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入

  2 set方法注入

    顾名思义,就是在类中提供需要注入成员的set方法。

 Spring的切面编程--AOP

  什么是AOP?

   AOP:全称是Aspect Oriented Programming即:面向切面编程。

  AOP的作用及优势  

   作用:

    在程序运行期间,不修改源码对已有方法进行增强。

   优势:

    减少重复代码  提高开发效率  维护方便

   AOP的实现方式

    使用动态代理技术

  说道切面编程,也许有很多人会很困惑,编程可以理解,而什么是切面呢?下面我们来详细的慢慢解释一下:

   首先,我们可以设想一下,在我们原先的项目中service层的一些需要事物控制的方法内,是不是一个方法内就需要写一段事物控制代码?这就导致了一个问题:

      我们的事务控制是重复性的代码。

    为什么这么说呢?因为一个类中就需要些多个事物控制代码了,那么如果有多个业务了,每个业务类中就都会有这些重复的代码。因此我们得出了这个结论。

  思考:

    我们怎么解决呢?:动态代理

  动态代理回顾:

    动态代理的特点:

      字节码随用随创建,随用随加载。它与静态代理的区别也在于此。因为静态代理是字节码一上来就创建好,并完成加载。装饰者模式就是静态代理的一种体现。

    动态代理常用的两种方式:

      基于接口的动态代理:

        提供者:JDK官方的Proxy类。

        要求:被代理类最少实现的一个接口。

      基于子类的动态代理:

        提供者:第三方的CGLib,如果报asmxxxx异常,需要导入asm.jar。

        要求:被代理类不能用final修饰的类(最终类)。

 Spring中的AOP

    关于代理的选择:

      在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。

    AOP相关术语:

Joinpoint(连接点):

  所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。

Pointcut(切入点):

  所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。

Advice(通知/增强):

  所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。

  通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。

Introduction(引介):

  引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field。

Target(目标对象):

  代理的目标对象。

Weaving(织入):

  是指把增强应用到目标对象来创建新的代理对象的过程。

  spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

Proxy(代理):

  一个类被AOP织入增强后,就产生一个结果代理类。

Aspect(切面):

  是切入点和通知(引介)的结合。

    学习spring中的AOP要明确的事

a、开发阶段(我们做的)

  编写核心业务代码(开发主线):大部分程序员来做,要求熟悉业务需求。

  把公用代码抽取出来,制作成通知。(开发阶段最后再做):AOP编程人员来做。

  在配置文件中,声明切入点与通知间的关系,即切面。:AOP编程人员来做。

b、运行阶段(Spring框架完成的)

  Spring框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。

  总结:

     面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

  编后语:Spring框架的内容太多了,本人目前也在学习中,以上内容仅是我根据自己目前掌握的内容以及一些借鉴资料编写,不足以确保一点不差,所以如有不对的地方,欢迎各位朋友指正,希望我们能共同进步。

时间: 2024-11-03 06:28:31

spring框架的一些技术总结的相关文章

Spring框架第三天

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

Java开发工程师(Web方向) - 04.Spring框架 - 第3章.AOP技术

Spring框架 - AOP概述 笔记https://my.oschina.net/hava/blog/758873Spring框架 - AOP使用 笔记https://my.oschina.net/hava/blog/758881 AOP技术单元测试 返回 本次得分为:7.00/7.00, 本次测试的提交时间为:2017-09-11, 如果你认为本次测试成绩不理想,你可以选择再做一次. 1 单选(2分) 如下关于AOP的描述中错误的是: 得分/总分 A. AOP可以对代码进行解耦: B. A

spring+websocket整合(springMVC+spring+MyBatis即SSM框架和websocket技术的整合)

java-websocket的搭建非常之容易,没用框架的童鞋可以在这里下载撸主亲自调教好的java-websocket程序: Apach Tomcat 8.0.3+MyEclipse+maven+JDK1.7 spring4.0以后加入了对websocket技术的支持,撸主目前的项目用的是SSM(springMVC+spring+MyBatis)框架,所 以肯定要首选spring自带的websocket了,好,现在问题来了,撸主在网上各种狂搜猛找,拼凑了几个自称是spring websocket

学习Spring框架等技术的方向、方法和动机

学习Spring框架最早学习Spring框架是在大二的时候,当时看了几本书,看了一些视频,主要是传智播客的.更多的,还是写代码,单独写Spring的,也有与Struts和Hibernate等框架整合的.很久以来,主要使用了Spring的注入功能和事务管理,其它功能没怎么用到,可能是没有这方面的需求吧.有好几次都想对Spring有个深入的学习,比如把Spring中的全部功能都了解下,学习下Spring的原理.这2件事情,都是半途而废,有一定深入或全面学习,没有坚持下去. 广度与深度回顾下自己学习技

如何在Spring框架中使用RMI技术

在博客<RMI远程方法调用技术>中使用纯Java代码演示了RMI技术的使用,本篇博客将介绍如何在Spring中使用RMI技术. 正如博客<RMI远程方法调用技术>提到的那样--RMI技术的应用通常包括在两个独立的应用程序中:RMI服务端应用程序和RMI客户端应用程序.本博客也从这两方面入手:        RMI服务端应用程序: 1.自定义远程接口 代码如下: package com.ghj.packageofrmi; /** * 定义远程接口. * * @author 高焕杰 *

Spring框架学习(9)AOP技术理解与使用

内容源自:AOP技术理解与使用 一.什么是AOP? aop技术是面向切面编程思想,作为OOP(面向对象编程)的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想. AOP底层也是面向对象:只不过面向的不是普通的Object对象,而是特殊的AOP对象.AOP的关注点是组成系统的非核心通用服务模块(比如登录检查等),相对于普通对象,aop不需要通过继承.方法调用的方式来提供功能,只需要在xml文件中以引用的方式,将非核心服务功能引用给需要改功能的核心业务逻辑对象或方法中.最终实

Spring框架初识(二)

1. AOP的相关概念       1.1 AOP概述         1.1.1 什么是AOP             AOP:全程是Aspect Oriented Programming 即面向切面编程.是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了

详细介绍spring框架(下篇)

上篇简单介绍了spring,下面详细介绍为什么需要spring框架? Spring带给我们什么 方便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合.有了Spring,用户不必再为单实例模式类.属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用. AOP编程的支持 通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付. 声明式事务的支持 在

[JavaEE] IBM - Spring 系列: Spring 框架简介

Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级的.强壮的 J2EE 应用程序.developerWorks 的定期投稿人 Naveen Balani 通过介绍 Spring 框架开始了他由三部分组成的 Spring 系列,其中还将介绍 Spring 面向方面的编程(AOP)和控制反转(IOC)容器. Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一