Spring AOP

AOP概念

  • 通知(Advice)

需要扩展的功能,类似上一例程中的审计功能

  • 连接点(JoinPoint)

使用通知的地方,比如方法前后,异常发生时。

  • 切入点(Pointcut)

符合要求的连接点集合是切入点,根据表达式筛选连接点。

  • 切面(Aspect)

切面是通知和切入点的结合

  • 目标对象 (Target)

代理的目标对象

  • 织入 (Weaving)

将切面应用到目标对象来创建新的代理对象过程。

  • 引入(introduction)

向现有的类添加新方法属性




UserMng.java

java 复制代码
package com.hk.eshop.aop;

import com.hk.eshop.java.IUserMng;

public class UserMng implements IUserMng {
    public void save(String id, String name) {
        System.out.println("save() id="+id+",name="+name);
    }

    public void find(String id) {
        System.out.println("find() id="+id);
    }
}

AuditAspect.java

java 复制代码
package com.hk.eshop.aop;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;

public class AuditAspect {
    public void audit(JoinPoint joinPoint)
    {
        Object[] args = joinPoint.getArgs();
        Signature sig = joinPoint.getSignature();
        System.out.println("触发方法......"+sig.getName());
        System.out.println("方法审计开始......");
        for(int i=1;i<=args.length;i++)
            System.out.println("第"+i+"个参数="+args[i-1]);
        System.out.println("方法审计结束......");
        System.out.println("切入点表达式......"+joinPoint.toString());
    }
}

Main.java

java 复制代码
package com.hk.eshop.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main( String[] args )
    {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        UserMng umng = (UserMng)ctx.getBean("userMng");
        umng.save("1","Java");
        umng.find("2");
    }
}

beans.xml

xml 复制代码
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="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/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <context:component-scan base-package="com.hk.eshop"/>

    <bean id="userMng" class="com.hk.eshop.aop.UserMng"/>
    <bean id="auditAspect" class="com.hk.eshop.aop.AuditAspect"/>

    <aop:config proxy-target-class="true">
        <aop:aspect id="aspect1" ref="auditAspect">
            <aop:pointcut id="save" expression="execution(* com.hk.eshop.aop.UserMng.save(..))"/>
            <aop:pointcut id="find" expression="execution(* com.hk.eshop.aop.UserMng.find(..))"/>
            <aop:before method="audit" pointcut-ref="save"></aop:before>
            <aop:before method="audit" pointcut-ref="find"></aop:before>
        </aop:aspect>
    </aop:config>
</beans>

POM.xml

xml 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.hk.eshop</groupId>
  <artifactId>SpringOne</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>SpringOne</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.2.18.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>3.2.18.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib-full</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>aspectj</groupId>
      <artifactId>aspectj-tools</artifactId>
      <version>1.0.6</version>
    </dependency>
  </dependencies>
</project>




相关推荐
LucianaiB6 小时前
别再被 AI 骗了:我把腾讯云 4 个 Skill 做成了个「AI 打假侦探」,过程的一个小配置坑惨了我
后端
mldong6 小时前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
candyTong6 小时前
Claude Code 如何恢复一段会话
后端·架构·ai编程
风流 少年7 小时前
Spring AI 2.0:Advisor
android·人工智能·spring
mqiqe7 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一517 小时前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding7 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
En^_^Joy7 小时前
Django项目配置全攻略:settings配置文件
后端·python·django
砍材农夫8 小时前
spring-ai|Spring‑AI 2.0.0 新特性 + 入门教程
spring boot·spring·spring cloud
Nebula_g8 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法