Spring学习(3)

Spring学习

aop

1.动态代理
实现方式:jdk动态代理,使用jdk中的Proxy,Method,InvocaitonHanderl创建代理对象。
jdk动态代理要求目标类必须实现接口

cglib动态代理:第三方的工具库,创建代理对象,原理是继承。 通过继承目标类,创建子类。
子类就是代理对象。 要求目标类不能是final的, 方法也不能是final的

2.动态代理的作用:
1)在目标类源代码不改变的情况下,增加功能。
2)减少代码的重复
3)专注业务逻辑代码
4)解耦合,让你的业务功能和日志,事务非业务功能分离。

3.Aop:面向切面编程, 基于动态代理的,可以使用jdk,cglib两种代理方式。
Aop就是动态代理的规范化, 把动态代理的实现步骤,方式都定义好了,
让开发人员用一种统一的方式,使用动态代理。

  1. AOP(Aspect Orient Programming)面向切面编程
    Aspect: 切面,给你的目标类增加的功能,就是切面。 像上面用的日志,事务都是切面。
    切面的特点: 一般都是非业务方法,独立使用的。
    Orient:面向, 对着。
    Programming:编程

oop: 面向对象编程

怎么理解面向切面编程 ?
1)需要在分析项目功能时,找出切面。
2)合理的安排切面的执行时间(在目标方法前, 还是目标方法后)
3)合理的安全切面执行的位置,在哪个类,哪个方法增加增强功能

术语:
1)Aspect:切面,表示增强的功能, 就是一堆代码,完成某个一个功能。非业务功能,
常见的切面功能有日志, 事务, 统计信息, 参数检查, 权限验证。

2)JoinPoint:连接点 ,连接业务方法和切面的位置。 就某类中的业务方法,一个类中的每一个方法都是连接点
3)Pointcut : 切入点 ,对连接点的筛选,筛选出需要增强功能的方法
4)目标对象: 给哪个类的方法增加功能, 这个类就是目标对象
5)Advice:通知,通知表示切面功能执行的时间。

说一个切面有三个关键的要素:
1)切面的功能代码,切面干什么
2)切面的执行位置,使用Pointcut表示切面执行的位置
3)切面的执行时间,使用Advice表示时间,在目标方法之前,还是目标方法之后。

5.aop的实现
aop是一个规范,是动态的一个规范化,一个标准
aop的技术实现框架:
1.spring:spring在内部实现了aop规范,能做aop的工作。
spring主要在事务处理时使用aop。
我们项目开发中很少使用spring的aop实现。 因为spring的aop比较笨重。

2.aspectJ: 一个开源的专门做aop的框架。spring框架中集成了aspectj框架,通过spring就能使用aspectj的功能。
aspectJ框架实现aop有两种方式:
1.使用xml的配置文件 : 配置全局事务
2.使用注解,我们在项目中要做aop功能,一般都使用注解, aspectj有5个注解。

6.学习aspectj框架的使用。
1)切面的执行时间, 这个执行时间在规范中叫做Advice(通知,增强)
在aspectj框架中使用注解表示的。也可以使用xml配置文件中的标签

@Aspect:是aspectj框架中的注解
      作用:表示当前类是切面类
      切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
      位置:在类定义的上面
切面类中的方法:
定义方法:实现切面功能的
	 方法的定义要求:
      1.公共方法 public
      2.方法没有返回值
      3.方法的名称自定义
      4.方法可以有参数,也可以没有参数
           如果有参数,参数不是自定义的,有几个参数类型可以使用
          
          
     指定通知方法中的参数:JoinPoint
     * JoinPoint:业务方法,要加入切面功能的业务方法
     *      作用是:可以在通知方法中获取方法执行的信息,例如方法的名称,方法的实参.
     *      如果你的切面功能中需要用到方法的信息,就加入JoinPoint.
     *      这个JoinPoint参数的值是由框架赋予的,必须是第一个位置的参数,否装上述功能都没有 程序还会报错

​ 1)@Before

@Before:表示前置通知
     *      属性:value,是切入点表达式,表示切面的功能执行的位置.
     *      位置:在方法的上面
     *特点:  1.在目标方法之前先执行
     *       2.不会改变目标方法的执行结果
     *       3.不会影响目标方法的执行.
     *      execution(public void com.dyw.ba01.SomeServiceImpl.doSome(String,Integer)表示切入的位置

​ 2)@AfterReturning

* 后置通知定义方法,方法是实现切面功能的.
     * 方法定义要求
     * 1.公共方法public
     * 2.方法没有返回值
     * 3.方法名称自定义
     * 4.方法有参数的,推荐Object,参数名自定义
     
     
@AfterReturning:后置通知
     *      属性:1.value 切入点表达式
     *          2.returning 自定义变量,表示方法的返回值的.
     *          自定义变量名必须和通知方法的形参一样
     *  .    位置:在方法定义的上面
     * 特点:
     * 1在目标方法之后生效
     * 2.能够获取到目标方法的返回值,可以根据这个返回值做不同的处理功能
     * 3.可以修改返回值
     *
     *
     * 后置通知的执行
     *      Object res = doOther();
     *      myAfterReturning(res);
     *      System.out.println(res);     

​ 3)@Around

 * 环绕通知方法的定义格式
 * 1.public
 * 2.必须要有一个返回值,推荐使用Object
 * 3.方法名称自定义
 * 4.方法有参数,固定的参数ProceedingJoinPoint

@Around: 环绕通知
    属性:value 切入点表达式
    位置:在方法的定义上面
特点:
 1.他是功能最强的通知
 2.在目标方法的前和后都能被调用执行
 3.控制目标方法是否被调用执行
 4.修改原来的目标方法的执行结果.影响最后调用的结果


 环绕通知.等同于jdk动态代理的InvocationHandler接口

 参数: ProceedingJoinPoint就等同于jdk动态代理的Method
     作用:执行目标方法的
 返回值:就是目标方法的执行结果,可以被修改


      ProceedingJoinPoint是继承了JoinPoint 所以它具有JoinPoint的特性

 环绕通知:经常做事务,在目标方法之前开启事务,执行目标方法,在目标方法之后提交事务
@param proceedingJoinPoint
@return

​ 4)@AfterThrowing 异常通知
​ 5)@After 后置通知

@Pointcut用于指定切入点的别名

@Before(value = "myPointcut()")
    public void myBefore01(){
        System.out.println("前置通知");
    }

    /**
     * @Pointcut:定义和管理切入点,如果你的项目中有多个切入点表达式是重复的,可以复用.
     *              可以使用@Pointcut
     *           属性:value 切入点表达式
     *           位置:自定义方法的上面
     *      特点:
     *          当使用@Pointcut定义在一个方法的上面,此时这方法的名称就是切入点表达式的别名.
     *          当其他的通知中,value属性就可以使用这个方法的名称,代替切入点表达式
     */

    @Pointcut(value = "execution(* *..SomeService.doSome(..))")
    public void myPointcut(){
        //无需代码 只是用该方法名代替切入点表达式
    }

2)表示切面执行的位置,使用的是切入点表达式。

	com.service.impl
	com.bjpowrnode.service.impl
	cn.crm.bjpowernode.service


  execution(* *..service.*.*(..))
											readme
									用aspectj框架实现aop


使用aop的目的是给已经存在的一些了业务方法,增加额外的功能,前提是不会更改原来类中的方法

### 使用aspectj实现aop的基本步骤
#### 1.新建maven项目
####2.加入依赖
 1. spring依赖
 2. aspectj依赖
 3. junit单元测试
#### 3.创建目标类:接口和他的实现类

#### 4.创建切面类:普通类
 1. 在类上面加入注解@Aspect
 2. 在类中定义方法,方法就是切面要执行的功能代码
    在方法上面加入aspectj中的通知注解,例如@Before
    有需要指定切入点表达式execution()
 
#### 5.创建spring配置文件:声明对象,把对象交给容器去统一管理声明对象你可以使用注解或xml配置文件<bean>
1. 声明目标对象
2. 声明切面类对象
3. 声明aspectj框架中的自动代理生成器标签.
    自动代理生成器:用来完成代理对象的自动创建功能的.

#### 6.创建测试类,从spring容器中获取目标对象(实际就是代理对象).通过代理执行方法,实现aop的功能

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值