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>



