您的位置:首页 > 编程语言 > Java开发

关于spring框架的核心技术之Aop

2020-06-08 04:54 99 查看

动态代理

spring框架的aop技术实现其实就是基于动态代理。

  • 动态代理的含义
    程序在执行过程中自动生成代理对象,通过代理对象的执行方法,使得被代理对象源代码不更改的情况下实现其功能扩展。

  • jdk动态代理
    jdk内置的动态代理要求代理对象要实现接口,jdk提供了三个类,Proxy、Method、InvocationHandler用于创建代理对象,实现功能扩展。

  • cglib 动态代理
    cglib是第三方类库,要求被代理类必须可以被继承,其子类就是功能增强了的代理对象,要求被代理类及其方法不能被final修饰。

AOP

Aop:面向切面编程,切面就是我们需要增加的功能,也是一种思想,是基于jdk,cglib动态代理的,是动态代理的规范化。

  • 要点
    1.使用时先找到被代理对象的切面,也就是除了业务之外的功能。
    2.确定切面执行的时间
    3.确定切面的执行位置,给谁增强功能

  • AOP的技术实现框架
    使用aspectJ框架,在maven项目pom.xml中添加依赖包
    1.切面执行时间常用使用以下的注解
    @Before
    @AfterReturning
    @Around
    @AfterThrowing
    @After
    2.切面的执行位置采用切入点表达式
    以上几个注解均有属性value,属性值为切入点表示式的字符串,表示切面执行的位置
    语法格式:
    execution(访问权限 方法返回值 方法声明(参数) 异常类型)
    3.符号

    例如:
    execution(public * *(…)) //指定切入点为:任意公共方法。

代码

  • 接口
//接口
public interface Target {
void doSome(String name,Integer age);
}
  • 实现类
/**
- 被代理对象
*/
public class TargetImpl implements Target {
@Override
public void doSome(String name,Integer age) {
//在执行doSome方法前增加一个功能
System.out.println("targetImpl的doSome方法执行了");
}
}
  • 切面类
//@Aspect注解声明这个类是切面类
@Aspect
public class ProxyByAspectJ {
/**
* 声明需要增加的功能
* 注意:
* 1.这个功能需是public修饰
* 2.这个功能没有返回值
*/
//Before:前置通知注解,在被代理对象方法执行之前执行
//execution(public * *.doSome(..)):任意包中的doSome方法,可以写具体切入点表示式
@Before(value="execution(public * *.doSome(..))")
public void doBefore(){
System.out.println("在doSome方法之前执行这个功能");
}
}
  • 在xml配置文件中声明aspectj框架中的自动代理生成器标签
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

<!--创建被代理对象-->
<bean id="target" class="com.huangliutan.TargetImpl"/>

<!--创建切面类对象-->
<bean id="proxy" class="com.huangliutan.ProxyByAspectJ"/>

<!--声明自动生成代理生成器,在内存中改变被代理对象的结构为代理对象-->
<context:aspectj-autoproxy/>
</beans>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: