纵观现在互联网行业,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框架的内容太多了,本人目前也在学习中,以上内容仅是我根据自己目前掌握的内容以及一些借鉴资料编写,不足以确保一点不差,所以如有不对的地方,欢迎各位朋友指正,希望我们能共同进步。

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

  1. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  2. Spring框架的AOP技术之通知类型

    1. 通知类型 * @Before -- 前置通知 * @AfterReturing -- 后置通知 * @Around -- 环绕通知(目标对象方法默认不执行的,需要手动执行) * @After - ...

  3. Spring 框架的核心功能之AOP技术

    1. AOP 的概述 AOP, Aspect Oriented Programming, 面向切面编程; 通过预编译方式和运行期动态代理实现程序功能的统一维护的技术; AOP 采取横向抽取机制,取代了 ...

  4. Spring框架的核心功能之AOP技术

     技术分析之Spring框架的核心功能之AOP技术 AOP的概述        1. 什么是AOP的技术?        * 在软件业,AOP为Aspect Oriented Programming的 ...

  5. 【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说

    大家好,好久不见,今天我们来一起学习一下关于Spring框架的IOC技术. 控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的 ...

  6. Spring框架的第三天

    ## Spring框架的第三天 ## ---------- **课程回顾:Spring框架第二天** 1. IOC的注解方式 * @Value * @Resource(name="" ...

  7. Spring框架之CGLIB的代理技术(代码了解)

    1.引入CBLIB的开发包 * 如果想使用CGLIB的技术来生成代理对象,那么需要引入CGLIB的开发的jar包,在Spring框架核心包中已经引入了CGLIB的开发包了.所以直接引入Spring核心 ...

  8. 通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术

    通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages( JSP)技术.Velocity.Tiles.iText 和 POI.Spring MVC ...

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

    第3章--AOP技术 Spring框架 - AOP概述 笔记https://my.oschina.net/hava/blog/758873Spring框架 - AOP使用 笔记https://my.o ...

随机推荐

  1. Memcached理解

    一.Memcached简介: 1. Memcached是一个自由开源的,高性能的,分布式内存对象缓存系统. 2. Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符 ...

  2. 网络库Alamofire使用方法学习笔记

    Github地址 由于Alamofire是swift网络库,所以,以下的所有介绍均基于swift项目 导入Alamofire 以下为使用cocoapods导入,其余的方式请参考官网 source 'h ...

  3. LeetCode 581. Shortest Unsorted Continuous Subarray (最短无序连续子数组)

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  4. go 代码的调试---打印调用堆栈

    本文介绍如何打印调用堆栈进行go代码的调试. 打印堆栈使用的runtime package中的Stack()函数 func Stack(buf []byte, all bool) int Stack ...

  5. 不定期更新的CSS样式设置

    头像图片的样式 假设这是一个头像图片,假设展示头像的框为100*100的div,而图片尺寸为510*765,如何让图片显示成这样呢? html结构很简单: <div class="im ...

  6. 一个比较实用的商业级图表Echarts

      了解了解                    ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼 ...

  7. 2-SAT问题总结

    2-SAT问题总结 2-SAT问题:n个布尔型的变量,给出m个约束条件,约束条件例如:A,B不能同时为真,A,B必须同时为真等. 看了算法入门经典中的解决办法,关于这种解决办法比较容易理解,并且效率也 ...

  8. PTA 数据结构 银行业务队列简单模拟

    仅供参考,请勿粘贴 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银行的顾客序列,请按业务完 ...

  9. Java多线程其他

    1.interrupt()方法 interrupt方法不会真正中断线程,它只会清楚线程的wait,sleep,join的受阻状态,时线程重新获得CPU的执行权. 此时如果再次调用线程的wait,sle ...

  10. SElinux用户管理操作

    查看当前用户上下文 id -Z 查看登陆的用户和其对应的SELinux用户 semanage login -l 改变用户和SELinux的对应关系 semanage login -a选项能改变,-s用 ...