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>




相关推荐
givemeacar12 小时前
spring session、spring security和redis整合的简单使用
redis·spring·bootstrap
Java女侠_9年实战12 小时前
Spring框架“惯性思维”坑——@Transactional失效场景、Bean注入循环依赖
后端
C雨后彩虹12 小时前
Java Lambda & Stream 避坑指南:20个高频错误案例分析与修复
java·stream·lambda·并行流
环流_13 小时前
多线程3(线程安全问题及解决方案)
java·开发语言
杰克尼13 小时前
天机学堂项目总结(day1~day2)
大数据·jvm·spring·elasticsearch·搜索引擎·spring cloud·mybatis
Ares-Wang13 小时前
flask》》多线程并发数据安全问题 threading.local werkzeug.local.Local
后端·python·flask
覆东流13 小时前
第2天:Python变量与数据类型
开发语言·后端·python
FeBaby13 小时前
Java 高并发场景下 Redis 分布式锁(UUID+Lua)最佳实践
java·redis·分布式
落子君13 小时前
设计模式之【 断路器模式】
java
添砖java。。。13 小时前
java实现mqtt链接并控制门锁设备
java·开发语言