Aop一些的概念
a) Cross Cutting Concern
是一种独立的服务,它会遍布在系统的整个处理流程中
b) Aspect
对横切关注点的模块化,在spring aop中,切面可以使用普通的类或者在普通类中以@Aspect注解类实现
c) Advice(通知)
对横切性关注点的具体实现,有before和after等类型
d) Pointcut(切入点)
它定义了Advice应用到那些JoinPoint上,对Spring来说就是方法的调用
e) Weave(织入)
将通知应用到Target Object上的过程
f) Target Object
Advice被应用的对象,这个对象永远是一个被代理(proxied)的对象
g)JointPoint
Advice在应用程序上执行的点或者时机,Spring只支持方法的JointPoint,这个店也可以使属性修改,如:Aspectj可以支持
********************************************************************************
第一步:将横切关注点模块化,建立AspectJText类,并采用注解指定该类为Aspect,
@Aspect
public class AspectJText {
/**
* 定义Pointcut,Pointcut的名称为addAddMethod(),
* 此方法没有返回值和参数
* 该方法就是一个标识,不进行调用
* * add*(..),代表执行以add开头的方法,
* 括号里的表示任意个参数,
* 当然可以不含参数
*/
@Pointcut("execution(* add*(..))")
private void addAddMethod(){
//注意执行的过程中,该句子不会打印出来,印证了该方法不会被调用
System.out.println("我不会被调用");
};
/**
* 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
*/
@Before("addAddMethod()")
private void befreExecuteTargetMethod() {
System.out.println("在调用目标方法之前调用我");
}
@After("addAddMethod()")
private void afterExecuteTargetMethod(){
System.out.println("在调用目标方法之后调用我");
}
}
第二步,启用AspectJ对Annotation的支持,并将目标类添加到IOC容器中,下面值spring中applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- 启用AspectJ对Annotation的支持 -->
<aop:aspectj-autoproxy/>
<bean id="ati" class="com.bjpowernode.spring.AddTextImpl"/>
<bean id="ajt" class="com.bjpowernode.spring.AspectJText"/>
</beans>
第三步,添加包含add字符方法的接口
/**
* 测试所有带有add的方法
* @author Arthur
*
*/
public interface AddText {
public void add();
public void add1();
public void textadd();
public void add(String str);
public void add(String str,String str1);
}
第四步,定义接口的实现类
package com.bjpowernode.spring;
public class AddTextImpl implements AddText {
@Override
public void add() {
System.out.println("---add---");
}
@Override
public void add(String str) {
System.out.println("---add---" + str);
}
@Override
public void add(String str, String str1) {
System.out.println("---add---" + str + "----" + str1);
}
@Override
public void add1() {
System.out.println("---add1---");
}
@Override
public void textadd() {
System.out.println("---textadd---");
}
}
第五步,客户端的实现
public class Client {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
AddText at = (AddText)factory.getBean("ati");
at.add();
System.out.println("*******************");
at.add1();
System.out.println("*******************");
at.add("一个参数的方法");
System.out.println("*******************");
at.add("参数一","参数2");
}
}
**************************************************************
下面是运行的结果
在调用目标方法之前调用我
---add---
在调用目标方法之后调用我
*******************
在调用目标方法之前调用我
---add1---
在调用目标方法之后调用我
*******************
在调用目标方法之前调用我
---add---一个参数的方法
在调用目标方法之后调用我
*******************
在调用目标方法之前调用我
---add---参数一----参数2
在调用目标方法之后调用我