关于spring AOP 的初步学习

来源:互联网 发布:淘宝多少级能上直通车 编辑:程序博客网 时间:2024/05/17 04:26

最近也是在看spring的东西,像IOC,我们在项目中都是经常在用的,但是AOP,像我这样工作一两年的小白却是只闻其声。
先来看看关于AOP的定义:面向切面编程,算是对面向对象编程(oop)的补充,因为oop一般都是定义纵向的对象关系,一层一层的垒起来,而如果我想在每访问一个方法时print出某个东西肿么办,难道要找出所有的方法,然后在所有方法中依次添加?那此时需求变更之后呢,是不是就GG了。。。所以aop就是干这个的,他能把这些与具体业务不相干但是又不得不加的逻辑代码分离出来,并统一管理,这样就能够减少系统重复代码,降低耦合度。
想象一下,我们需要添加公共代码的地方在球里,我们需要切开,定位到那个位置才能添加,所以我们需要需要一个切面,并告诉系统这个切面在哪里,这差不多就是我理解的面向切面。

AOP的核心概念:

1、横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)

类是对物体特征的抽象,切面就是对横切关注点的抽象

3、连接点(joinpoint)

被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

4、切入点(pointcut)

对连接点进行拦截的定义

5、通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

6、目标对象

代理的目标对象

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

Spring对AOP的支持

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
(PS:我做实例的时候就出现了问题,下表:)
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB。

首先,在运用aop之前,我们还需要下载jar包:aspectj.jar和aopalliance.jar

首先我们需要定义一个类,就是公共代码:

public class demo {    public void printTime(){        System.out.println("你好,我打印出来了");    }}

然后在IOC容器中添加AOP的声明和配置

<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"    xmlns:tx="http://www.springframework.org/schema/tx"    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd        http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"><bean id="indexaction" class="action.IndexAction"/><bean id="demotime" class="action.demo"/><aop:config><aop:aspect id="time" ref="demotime">//定义一个切面<aop:pointcut id="addAllMethod" //定义切入点expression="execution(* action.IndexAction.*(..))" /><aop:before method="printTime" pointcut-ref="addAllMethod" />//定义在目标切入点执行什么方法<aop:after method="printTime" pointcut-ref="addAllMethod" /></aop:aspect></aop:config></beans>

效果:
这里写图片描述

实际上如果就是这样的话会出现个问题,就是加上aop后,spring会出现原来的bean注入失败。这时必须要修改成
这就是刚才PS里所说的问题,proxy-target-class属性值决定是基于接口的还是基于类的代理被创建,我的是基于类的,所以将这个属性的值变成true,默认是基于接口的false

原创粉丝点击