Spring AOP(一)(基本概念+基于配置的AOP)

本文介绍了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过具体案例,展示了如何利用AspectJ进行代码增强,包括前置通知、后置通知、返回后通知等多种通知类型的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于maven的配置文件路径问题以及工程结构可参考以下博客:
http://www.cnblogs.com/pixy/p/4798089.html

这里写图片描述

简要概述:
1. AOP:Aspect Oriented Programming的缩写,面向切面编程,通过预编译方式和运行期动态代理实现的统一维护的一种技术提供了声明式的企业服务,特别是EJB的替代服务的声明,允许用户定制自己的方面,以完成OOP和AOP的互补使用(AOP在各个功能之间横切的功能)
主要的功能:日志记录,性能统计,安全控制,事务处理,异常处理等。
2. AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
“Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码降低模块之间的耦合度,并有利于未来的可操作性和可维护性。比如日志 异常处理 等等服务于各个模块,但不便于再各个模块重新定义,否则会增大代码量。
3. 切入点也可以理解为对拦截点的一个定义,比如前置通知 后置通知,返回后通知等,它们通知时的时间并不同
4. 切入点与连接点的关系:连接点是切入点的统称,每个切入点对应一个具体的连接点,将通知或拦截器插入到具体的连接点上


Schema-based AOP(基于配置的AOP)

这里写图片描述

简要概述:Spring 所有的切面和通知器都必须放在一个< aop:config >内(可以配置包含多个< aop:config >)
<aop:config>可以包含pointcut,advisor和aspect元素(必须按照这个顺序)<aop:config>大量Spring自动代理机制


代码实例

1.pom.xml(注意添加Spring AOP依赖的jar包aspectjrt.jar aspectjweaver.jar)

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>

2.创建Student.java

public class Student {
private int age;
private String name;

public Student() {
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "Student{" + "age=" + age + ", name='" + name + '\'' + '}';
}
}

3.创建Logger.java

public class Student {
private int age;
private String name;

public Student() {
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "Student{" + "age=" + age + ", name='" + name + '\'' + '}';
}
}

4.application.xml配置

<bean id="logger" class="com.ruanjianlin.demo.Logger"></bean>
 <aop:config>
<aop:aspect id="log" ref="logger">
    <aop:pointcut id=" selectAll"  expression="execution(*com.ruanjianlin.demo.*.*(..))"/><!-- 执行这个包下的所有方法--><!--expression="ececution(* com.ruanjianlin.demo.*.*(..))" -->
<aop:before method="beforeAdvice" pointcut-ref=" selectAll"/>
<aop:after method="afterRunning" pointcut-ref=" selectAll"/>
    <aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref=" selectAll"/>
   <aop:after-returning method="afterReturning" returning="val" pointcut-ref=" selectAll"/>
</aop:aspect>
</aop:config>
 <bean id="student" class="com.ruanjianlin.demo.Student">
 <property name="name" value="ruanjinlin"/>
 <property name="age" value="21"/>
 </bean>

5.测试类的使用

ApplicationContext context =
    new ClassPathXmlApplicationContext("application.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();

6.运行结果

beforeAdvice
afterRunning
afterRturningruanjinlin
beforeAdvice
afterRunning
afterRturning21

简要分析:前置通知-后置通知-返回后通知-得到结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值