aop简单注解实现例程

时间:2022-12-02 20:35:46

Aop一些的概念

a)       Cross Cutting Concern

     是一种独立的服务,它会遍布在系统的整个处理流程中

b)       Aspect

    对横切关注点的模块化,在spring aop中,切面可以使用普通的类或者在普通类中以@Aspect注解类实现

c)       Advice(通知)

    对横切性关注点的具体实现,有beforeafter等类型

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
在调用目标方法之后调用我