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>




相关推荐
架构师沉默2 小时前
Gemini 正式登陆香港,不用翻墙!
java·后端·架构
zihao_tom2 小时前
Spring WebFlux:响应式编程
java·后端·spring
想打游戏的程序猿2 小时前
从零理解 LLM 与 Agent
后端·ai编程
一只大袋鼠2 小时前
JavaWeb ——Cookie 对象
java·servlet·javaweb·cookie·小蛋糕
wooyoo2 小时前
花了一周 vibe 了一个 OpenClaw 的 Agent 市场,聊聊过程中踩的坑
前端·后端·agent
树獭叔叔3 小时前
文本Embedding模型演进:从Encoder-only到LLM-based的技术变革
后端·aigc·openai
游离态指针3 小时前
首字节响应 0ms?我用 1000 行代码驯服了 Spring AI Agent 的“不确定性”
后端
、BeYourself3 小时前
Scala 字面量
开发语言·后端·scala