您的位置:首页 > 运维架构

aop简单注解实现例程

2012-08-07 00:27 363 查看
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

在调用目标方法之后调用我
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: