spring--AOP经典(XML Sechma和Annotation 两种配置方式总结)学习小例子

1 最近在复习spring AOP,下面是自己测试的一个学习例子,共大家参考,有不同意见欢迎指出。
2

3 1.定义接口:
4 public interface IHello {
5  
6      public void hello(String name);
7  }
2.接口的实现类:
public class HelloSpeaker implements IHello{
 
     public void hello(String name) {
         System.out.println("Hello()---"+name);
     }
 }
 1 3.定义一个Before  Aspect
 2 
 3 public class LogAspect implements BeforeAdvice{
 4  
 5      private Logger logger = Logger.getLogger(this.getClass().getName());
 6      
 7      /**
 8       * before方法是:在目标对象上的方法被执行前要执行的方法,jointPoint参数是可选项。
 9       * 通过JointPoint对象,可以获得目标对象【getTarget()】、目标方法上的参数[getArgs()]等信息
10       * @param jointPoint
11       */
12      public void before(JoinPoint jointPoint){
13          //在这里添加业务逻辑代码
14          logger.log(Level.INFO, "这是before(),在hello方法执行之前执行,在这里添加要织入的业务逻辑代码!!!"+
15                  jointPoint.getSignature().getDeclaringTypeName()+"."+jointPoint.getSignature().getName());
16          
17      }
18  }
 1 4.编写配置文件:
 2 
 3 <!--
 4   注释:
 5   <aop:aspect></aop:aspect>用于定义Advice实例
 6   <aop:before></aop:before>表示当前实例用于实现 Before Advice
 7   pointcut属性用于指定porintcut表达式 
 8   -->
 9  <!-- Advice 等价于 Aspect-->
10  <bean id="logAspect" class="spaop.LogAspect"></bean>
11  <!-- 目标类 -->
12  <bean id="helloSpecker" class="spaop.HelloSpeaker"></bean>
13  <aop:config>
14      <!-- Pointcut 指在哪些方法织入? -->
15      <aop:pointcut  id="logHello" expression="execution(* spaop.IHello.*(..))"/><!-- 注意这里的写法,*号必须与spaop之间有个空格,其中*代表返回值类型,往后指方法 -->
16      <!-- Advice的配置  指在方法的前、后、Around中织入? -->
17      <aop:aspect id="logging" ref="logAspect">
18          <aop:before pointcut-ref="logHello" method="before"/> 
19      </aop:aspect>
20  </aop:config>
 1 5.编写一个测试类:
 2 public class TestCC {
 3      public static void main(String[] args) {
 4          ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
 5          try {
 6              IHello helloSpeaker = (IHello) ctx.getBean("helloSpecker");
 7              helloSpeaker.hello("kingjames");
 8          } catch (Exception e) {
 9              e.printStackTrace();
10          }
11      }
12  }

运行结果:

10:49:17,421 INFO - 这是before(),在hello方法执行之前执行,在这里添加要织入的业务逻辑代码!!!spaop.IHello.hello

Hello()---kingjames

总结:按照以上步骤规则类写,不易犯错误

 

1 例子2:基于Annotation的配置方式
2 1.定义接口:
3 public interface IHello {
4  
5      public void hello(String name);
6  }
1 2.接口实现类:
2 public class HelloSpeaker implements IHello{
3  
4      public void hello(String name) {
5          System.out.println("Hello()---"+name);
6      }
7  }
 1 3.编写Aspect类:使用Annotation的方式
 2 @Aspect    //相当于是一个Advice
 3  public class LogBeforeAdvice {
 4  
 5      @Before("execution(* spaop.IHello.*(..))")
 6      public void before(JoinPoint joinPoint){
 7          //在这里织入逻辑代码...
 8          System.out.println("Logging before"+joinPoint.getSignature().getName()+"执行Before方法,把业务逻辑代码添加到这来,以便插入到hello()方法的前面。。!!");
 9      }
10  }
11  
1 4.配置文件:
2 <!-- Advice 等价于 Aspect-->
3  <bean id="logAspect" class="spaop.LogAspect"></bean>
4  <!-- 目标类 -->
5  <bean id="helloSpecker" class="spaop.HelloSpeaker"></bean>
  <!-- 使用自动装配的方式 --> 6 <bean id="logBeforeAdvice" class="spaop.annotation.LogBeforeAdvice"></bean> 7 <aop:aspectj-autoproxy /> 8
posted @ 2012-10-29 10:59  wellkingsen  阅读(248)  评论(0)    收藏  举报