Spring 详解

一、什么是Spring?

1、概念:Spring是一个控制反转IOC和AOP的开发框架和平台。是一个主流的Java Web开发框架,该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力。

2、优点

1)方便解耦,简化开发

Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给Spring管理。

2)方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如Struts2、Hibernate、MyBatis等)的直接支持

3)降低Java EE API的使用难度

Spring对Java EE开发中非常难用的一些API(JDBC、JavaMail、远程调用)都提供了封装,使这些API应用的难度大大降低。

4)方便程序的测试

Spring 支持Junit4,可以通过注解方便地测试Spring程序

5)AOP编程的支持

Spring提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。

6)声明式事务的支持

只需要通过配置就可以完成对事务的管理,而无须手动编程。

二、Spring AOP理解

1、OOP面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。

2、AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块的耦合度,同时提高了系统的可维护性,可用于权限认证,日志,事务处理

举个例子说明下:

有A,B,C三个方法,但是在调用每一个方法之前,要求打印一个日志:某一个方法被开始调研了!

在调用每个方法之后,也要求打印日志:某个方法被调用完了!

一般人会在每一个方法的开始和结尾部分都会添加一句日志打印吧,这样做如果方法多了,就会有很多重复的代码,显得很麻烦,这时候有人会想到,为什么不把打印日志这个功能封装一下,然后让它能在指定的地方(比如执行方法前,执行方法后)自动的去调用呢?如果可以的话,业务功能代码中就不会掺杂这一代码,所以AOP就做了这一类的工作,比如:日志输出,事务控制,异常处理

如果把AOP当做成给我们写的“业务功能”增添一些特效,就会有这么几个问题:

1)我们要制作哪些特效

2)这些特效使用在什么地方

3)这些特效什么时候来使用。

有了这三疑问,来说一下AOP的一些术语

(1)通知(Advice):就是想要的功能,也就是上面说的安全,事务,日志等。首先得定义好,然后再想用的地方用一下。

(2)连接点(JoinPoint):就是spring允许你使用通知的地方,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点,其他如AspectJ还可以让你在构造器或属性注入时都行,只要记住,和方法有关的前前后后(抛出异常),都是连接点

(3)切入点(PointCut):上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点吧,但是你并不想在所有方法附近都使用通知(使用叫织入),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。

(4)切面(Aspect):切面是通知和切入点的结合,连接点就是为了让你好理解切点,明白这个 概念就行,通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在干嘛(指定到底是哪个方法),这就是一个完整的切面定义。

(5)引入(introduction):允许我们向现有的类添加新方法属性,这不就是把切面(也就是新方法属性:通知定义的)用到目标类吗

(6)目标(target):引入中所提到的目标类,也就是被通知的对象,也就是真正的业务逻辑,他可以在好不知情的情况下,被咱们织入切面,而自己专注业务本身的逻辑。

(7)代理(Proxy):怎么实现整套AOP机制的,都是通过代理

(8)织入(weaving):把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时

三、IOC

全称Inversion of Control,翻译为“控制反转”,还有一个别名为DI(Dependency Injection),即依赖注入。所谓IOC,就是由Spring IOC容器来负责对象的生命周期和对象之间的关系。

如何理解“控制反转”,请回答以下四个问题:

1)、谁控制谁:在传统的开发模式下,我们都是采用直接new一个对象的方式来创建对象,也就是说你依赖的对象直接由你自己控制,但是有了IOC容器后,则直接由IOC容器来控制,所以“谁控制谁”,当然是IOC容器控制对象。

2)、控制什么:控制对象

3)、为何是反转:没有IOC的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转、但是有了IOC后,所依赖的对象直接由IOC容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。

4)、哪些方面反转了:所依赖对象的获取被反转了。

IOC Service Provide为被注入对象提供被依赖对象也有如下几种方法:构造方法注入,setter方法注入,接口注入。

构造器注入,顾名思义就是被注入的对象通过在其构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。

构造器注入方式比较直观,对象构造完毕后就可以直接使用,这就好比你出生你家里就给你指定了你媳妇。

setter方法注入:对于JavaBean对象而已,我们一般都是通过getter和setter方式来访问和设置对象的属性。所以,当前对象只需要为其所依赖的对象提供相对应的setter方法,就可以通过该方法将相应的依赖对象设置到被注入对象中。

接口方式注入:接口方式注入显得比较霸道,因为它需要被依赖的对象实现不必要的接口,带有侵入性,一般不推荐这种方式。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值