Chinaunix首页 | 论坛 | 博客
  • 博客访问: 204027
  • 博文数量: 66
  • 博客积分: 966
  • 博客等级: 准尉
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-11 11:52
文章分类

全部博文(66)

文章存档

2012年(60)

2011年(6)

分类: Java

2012-10-17 14:59:30

 
(-)注解方式实现AOP拦截
 
1. 定义业务接口以及具体实现
 
a. 接口省略
 
b. 业务实现
package cn.itcast.service.Impl;
import cn.itcast.service.PersonService;
/**
 * spring 通过注解方式完成 aop 编程
 * @author Administrator
 *
 */
public class PersonServiceBean implements PersonService{

 
 public String getPersonName(Integer personid) {
  
  System.out.println("我是getPersonName()方法");
  return "xxxx";
 }
 public void save(String name) {
  
  throw new RuntimeException("我爱例外通知");
  // System.out.println("我是save()方法");
  
 }
 public void update(String name, String id) {
  
  System.out.println("我是update()方法");
  
 }

 
}
2.定义一个切面类实现切面编程:
 
package cn.itcast.service;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.After;
//声明切面这样MyInterceptor就会被容器检测到 那么如何将一个类交给容器管理有2种方式
//一种在 xml 里定义bean MyInterceptor 另一种是 自动扫描注解的方式 在类前加 @Component 同时在配置文件中设置自动哦扫表的配置
@Aspect
public class MyInterceptor {
    //声明切入点 定义要拦截的方法 自左向右 第一个*表示返回值的类型 + 要拦截的类所在的包绝对路径 + .*<表示对此类中所有的方法进行拦截> +(..)<表示参数>
 //整句话的意识当要执行到PersonServiceBean类中的所有方法将被拦截到
 @Pointcut("execution (* cn.itcast.service.Impl.PersonServiceBean.*(..))")
 //声明一个切入点anyMethod()表示切入点的名称,
 private void anyMethod(){  }
 //表示先执行doAccessCheck完此方法此啊可以执行anyMethod()方法
 @Before("anyMethod()") // 前置通知表示在拦截业务PersonServiceBean中方法之前执行的如下 ,意思先打印出前置通知,然后在执行业务bean中的方法
 public void doAccessCheck(){
  System.out.println("前置通知");
 }
 
 @AfterReturning("anyMethod()")
 public void doAfterReturning(){
  System.out.println("后置通知");
 }
 
 @After("anyMethod()")
 public void doafter(){
  System.out.println("最终通知");  
 }
 
 @AfterThrowing("anyMethod()")
 public void afterThrowing(){
  System.out.println("例外通知");  
 }
 
 @Around("anyMethod()") //环绕通知
 public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
  //if(){用户是否有权限
  System.out.println("进入方法"); 
  Object resulet = pjp.proceed();
  System.out.println("退出方法"); 
     //  }
  return resulet;
 }
}
3 . 将切面通过spring 容器加载具体配置如下

       xmlns:xsi=""
       xmlns:context=""
       xmlns:aop=""     
       xsi:schemaLocation="
          
          
           ">
        
        
        
       
       
 
4. 写一个junit4 类
   public class AOPTest {
 @BeforeClass
 public static void setUpBeforeClass() throws Exception {
 }
    @Test public void proxyTest(){
 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
     PersonService service = (PersonService)ctx.getBean("personService");
     service.save("hehe");
   
   }
  
 
 
}
 
5.说明
如上述:
  在beans.xml配置文件中打如下,这样就支持注解,支持aop编程啦:
  ( 注解本身不能干活,需要处理器去处理;)启动对Aspect注解的支持(蓝色部分);
 
  1.切入点?什么是切入点就,我们要对业务bean中的那些方法进行拦截;
  2.通知?对拦截到的方法,我们要做的工作。
 
 
(2) 基于XML完成aop拦截
     
 业务方法及实现不变;
     
 a. 但是切面类有所改变,如:
         package cn.itcast.service;
import org.aspectj.lang.ProceedingJoinPoint;
/**
 * 基于XML方式实现AOP切面编程
 * @author Administrator
 */
public class MyInterceptorofXML {
 
//  private void anyMethod(){ };
 
 public void doAccessCheck(){
  System.out.println("前置通知");
 }
 
 public void doAfterReturning(){
  System.out.println("后置通知");
 }
 
 public void doafter(){
  System.out.println("最终通知");  
 }
 
 public void afterThrowing(){
  System.out.println("例外通知");  
 }
 
 public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
  //if(){用户是否有权限
  System.out.println("进入方法"); 
  Object resulet = pjp.proceed();
  System.out.println("退出方法"); 
     //  }
  return resulet;
 }
}
b.spring 容器 beans1.xml

       xmlns:xsi=""
       xmlns:context=""
       xmlns:aop=""     
       xsi:schemaLocation="
          
          
           "> 
         
        
        
                      
                      
                           
                           
                           
                           
                           
                           
                           
                           
                           
                       
               
        
       
       
 
 
:说明
      如果
           expression="execution(* cn.itcast.service.Impl.PersonServiceBean.*(..))" />
        这里 第一 * 代表返回值,如果拦截的方法返回是String 那么侧 将 * 改为 java.lang.String
那么拦截的业务方法只能拦截到 getName方法;
如果(..)表示2个参数,可以用 类似在 .. 之前加上传入参数的类型比如 Java.lang.String
 
想要彻底学习可以参看 spring2.5 视频20课
阅读(3649) | 评论(0) | 转发(0) |
0

上一篇:面向对象的分析和设计的秘诀

下一篇:没有了

给主人留下些什么吧!~~