spring aop
软件152 程永绩
1.什么是AOP
a.横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
b.切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
c.连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
d.切入点(pointcut)
对连接点进行拦截的定义
e.通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
f.目标对象
代理的目标对象
g.织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
h.引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
2.AOP实例
a.猴子类(普通类)
public class Monkey {
public void stealPeaches(String name){
System.out.println("【猴子】"+name+"正在偷桃...");
}
}
b.守护者类(声明为Aspect):
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class Guardian {
@Pointcut("execution(* com.samter.common.Monkey.stealPeaches(..))")
public void foundMonkey(){}
@Before(value="foundMonkey()")
public void foundBefore(){
System.out.println("【守护者】发现猴子正在进入果园...");
}
@AfterReturning("foundMonkey() && args(name,..)")
public void foundAfter(String name){
System.out.println("【守护者】抓住了猴子,守护者审问出了猴子的名字叫“"+name+"”...");
}
}
c.XML配置文件:
<!-- 定义Aspect -->
<bean id="guardian" class="com.samter.aspect.Guardian" />
<!-- 定义Common -->
<bean id="monkey" class="com.samter.common.Monkey" />
<!-- 启动AspectJ支持 -->
<aop:aspectj-autoproxy />
d.测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
Monkey monkey = (Monkey) context.getBean("monkey");
try {
monkey.stealPeaches("孙大圣的大徒弟");
}
catch(Exception e) {}
}
}
e.输出结果
【守护者】发现猴子正在进入果园...
【猴子】孙大圣的大徒弟正在偷桃...
【守护者】抓住了猴子,守护者审问出了猴子的名字叫“孙大圣的大徒弟”...