首页 > 代码库 > spring aop

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="http://www.mamicode.com/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.输出结果

【守护者】发现猴子正在进入果园...  

【猴子】孙大圣的大徒弟正在偷桃...  

【守护者】抓住了猴子,守护者审问出了猴子的名字叫“孙大圣的大徒弟”...  

spring aop