读书人

aop容易注解实现例程

发布时间: 2012-09-18 16:21:42 作者: rapoo

aop简单注解实现例程

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)的对象

********************************************************************************

第一步:将横切关注点模块化,建立AspectJText类,并采用注解指定该类为Aspect,

@Aspectpublic 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 {@Overridepublic void add() {System.out.println("---add---");}@Overridepublic void add(String str) {System.out.println("---add---" + str);}@Overridepublic void add(String str, String str1) {System.out.println("---add---" + str + "----" + str1);}@Overridepublic void add1() {System.out.println("---add1---");}@Overridepublic 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
在调用目标方法之后调用我

读书人网 >编程

热点推荐