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>




相关推荐
mldong7 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾18 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
zhanghe6878 小时前
es的密码带有特殊字符,导出
java
pnoker8 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
my_realmy8 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
天远数科9 小时前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
步行cgn9 小时前
YAML 的语法规则
spring boot·后端
骇客野人9 小时前
SpringBoot电商系统用户注册、登录、留存及数据埋点设计与落地实施方案
java·spring boot·后端
qiuhaipeng110 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
霸道流氓气质10 小时前
Spring AI 输出解析器进阶
人工智能·windows·spring