分享

Spring AOP示例(注解方式)

 旭龙 2011-12-06

Spring AOP示例

一.使用Annotation
 1.定义切面
package com.yyj.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class TestAspect {
 
 @Pointcut("execution(* com.yyj.service.*.*(..))")
 public void testPointCut(){
 }
}
注: @Aspect说明该类是个切面,@Component将该bean自动注入到springIOC容器,
 默认id为类名第一个字母转小写;
 @Pointcut("execution(* com.yyj.service.*.*(..))")定义一个切入点,
 后面的表达式说明对com.yyj.service包及子包下的所有方法进行拦截,植入其它操作,
 其它操作由对应的Advise定义。
 2.定义advise
package com.yyj.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TestAdvise {
 
 @Before("com.yyj.aspect.TestAspect.testPointCut()")
 private void testBefore(){
  System.out.println("begin-----in-----");
  System.out.println("before test...");
  System.out.println("end  -----in-----");
 }
}
注: @Before("com.yyj.aspect.TestAspect.testPointCut()"),定义了testPointCut这个切入点
 要做的操作是在执行被切入方法之前先执行testBefore方法。
 3.配置
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www./schema/beans"
 xmlns:xsi="http://www./2001/XMLSchema-instance"
 xmlns:aop="http://www./schema/aop"
 xmlns:context="http://www./schema/context"
 xmlns:jee="http://www./schema/jee"
 xmlns:lang="http://www./schema/lang"
 xmlns:tx="http://www./schema/tx"
 xmlns:util="http://www./schema/util"
 xsi:schemaLocation="http://www./schema/beanshttp://www./schema/beans/spring-beans-3.0.xsd
  http://www./schema/aophttp://www./schema/aop/spring-aop-3.0.xsd
  http://www./schema/contexthttp://www./schema/context/spring-context-3.0.xsd
  http://www./schema/jeehttp://www./schema/jee/spring-jee-3.0.xsd
  http://www./schema/langhttp://www./schema/lang/spring-lang-3.0.xsd
  http://www./schema/txhttp://www./schema/tx/spring-tx-3.0.xsd
  http://www./schema/utilhttp://www./schema/util/spring-util-3.0.xsd">
 
 <aop:aspectj-autoproxy/>
 <!-- 启动Spring注解自动注入Bean -->
 <context:component-scan base-package="com.yyj" />
 </beans>
 
 4.定义测试类
package com.yyj.service;
import org.springframework.stereotype.Component;

@Component
public class Testa{
 public void test(){
  System.out.println("test...");
 }
}

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yyj.service.Testa;

public class MainTest {

 private static ClassPathXmlApplicationContext springCtx;

 synchronized static void startup() {
  if (springCtx == null) {
   System.out.println("start up...");
   springCtx = new ClassPathXmlApplicationContext();
   springCtx
     .setConfigLocations(new String[] { "applicationContext.xml" });
   springCtx.refresh();
   Testa ta = (Testa)springCtx.getBean("testa");
   ta.test();
   System.out.println("start up...ok");
  }
 }

 public static void main(String[] args) {
  new MainTest().startup();
 }
}

二.不使用Annotation注解也可以如下类似配置
 <aop:aspectj-autoproxy/>
  <!-- 启动Spring注解 -->
 <context:component-scan base-package="com.yyj" />
 <!--<tx:annotation-driven proxy-target-class="true" />  -->
 <aop:config>
  <aop:aspect ref="myPoint">
   <aop:pointcut expression="execution(* com.yyj.service.FooService.getFoo(..))" id="pointCut"/>
   <aop:before pointcut-ref="pointCut" method="myAroundMethod"/>
  </aop:aspect>
 </aop:config>
注:PointCut和Advise可以在一个类中,也可以分开定义

工程用到jar

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多