AOP 即 Aspect Oriented Program 面向切面编程
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP
一个简易的项目
例子是完成业务类的日志切面,要求自己完成性能切面
// 例子的日志切面
package aspect;
import org.aspectj.lang.ProceedingJoinPoint;
public class LoggerAspect {
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("start log:" + joinPoint.getSignature().getName());
Object object = joinPoint.proceed();
System.out.println("end log:" + joinPoint.getSignature().getName());
return object;
}
}
//自己写的性能切面
package aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import java.util.Date;
public class PerformanceAspect {
public Object perform(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object object = joinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println("runtime:" + (endTime - startTime));
return object;
}
}
XML方式完成配置AOP
//XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 控制反转 目标类 -->
<bean name="s" class="ProductService">
</bean>
<!-- 控制反转 切面类 -->
<bean id="loggerAspect" class="LoggerAspect"/>
<!-- 控制反转 性能统计的切面类 -->
<bean id="performerAspect" class="PerformerAspect"/>
<aop:config>
<!-- 设置切入点的作用对象和id -->
<aop:pointcut id="loggerCutpoint"
expression=
"execution(* com.how2java.service.ProductService.*(..)) "/>
<!-- 设置切面的id,以及该切面中的log方法会被以环绕“around”方式放置于loggerCutpoint切入点 -->
<aop:aspect id="logAspect" ref="loggerAspect">
<aop:around pointcut-ref="loggerCutpoint" method="log"/>
</aop:aspect>
<!-- bean时一个id,aop时一个id -->
<!-- 这里的ref应该放的是切面类的id或name,而不是切面类的类名,千万不要搞错了 -->
<aop:aspect id="performAspect" ref="performerAspect">
<aop:around pointcut-ref="loggerCutpoint" method="perform"/>
</aop:aspect>
</aop:config>
最后就是业务类啦,很弱智的函数,方便了解spring就行
package service;
public class ProductService {
public void doSomeService(){
System.out.println("do!");
}
}
我这里两个切面作用的是同一个切入点,代码还是很好懂的。加油!
后面用注解方式配置AOP会更简单