zoukankan      html  css  js  c++  java
  • springAOP的helloworld(转载)

    
    通过一个例子简单了解springAOP
    实现步骤:
    1、使用MyEclipse自动添加spring支持
    2、从网上下载lombok(可以使代码看起来更加简洁)
    3、编写配置文件:applicationContext.xml
    4、编写业务接口
    5、实现业务接口
    6、编写aop切面类
    7、测试
    标签: Spring
    代码片段(5) [全屏查看所有代码]
    1. [代码]配置文件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-4.1.xsd  
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd  
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
     
        <!-- 启用Spring对基于@AspectJ aspects的配置支持 -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
     
        <bean id="userManager" class="com.jack.bus.impl.UserManagerImpl"></bean>
     
        <bean id="aspectJAdvice" class="manager.AspectAdvice"></bean>
     
    </beans>
    2. [代码]编写接口IUserManager.java     
    
    package com.jack.bus;
     
    public interface IUserManager {
        public void addUser();
     
        public void deletUser();
     
        public void findUser();
     
        public void modifyUser();
     
    }
    3. [代码]实现接口UserManagerImpl.java     
    
    package com.jack.bus.impl;
     
    import com.jack.bus.IUserManager;
     
    public class UserManagerImpl implements IUserManager {
     
        @Override
        public void deletUser() {
            // TODO Auto-generated method stub
            System.out.println("删除用户");
        }
     
        @Override
        public void modifyUser() {
            // TODO Auto-generated method stub
            System.out.println("修改用户");
        }
     
        @Override
        public void addUser() {
            // TODO Auto-generated method stub
            System.out.println("新增用户");
        }
     
        @Override
        public void findUser() {
            // TODO Auto-generated method stub
            System.out.println("查询用户");
        }
     
    }
    4. [代码]编写切面类AspectAdvice.java     
    
    package manager;
     
    import java.util.Date;
     
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
     
    @Aspect
    public class AspectAdvice {
        /**
         * Pointcut 定义Pointcut,Pointcut的名称为aspectjMethod(),此方法没有返回值和参数
         * 该方法就是一个标识,不进行调用
         */
        @Pointcut("execution(* add*(..))||execution(* del*(..))")
        private void aspectjMethod() {
        };
     
        // 自定义After
        // @After("execution(* add*(..))")
        public void doSava(JoinPoint joinPoint) {
            System.out.println("这是日志:新增用户成功---" + new Date());
        }
     
        /**
         * Before 在核心业务执行前执行,不能阻止核心业务的调用。
         * 
         * @param joinPoint
         */
        // @Before("aspectjMethod()")
        public void doBefore(JoinPoint joinPoint) {
            System.out.println("-----doBefore.invoke-----");
            System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等");
            System.out.println(" 可通过joinPoint来获取所需要的内容");
            System.out.println("-----End of doBefore()------");
        }
     
        /**
         * Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
         * 
         * 注意:当核心业务抛异常后,立即退出,转向AfterAdvice 执行完AfterAdvice,再转到ThrowingAdvice
         * 
         * @param pjp
         * @return
         * @throws Throwable
         */
        // @Around(value = "aspectjMethod()")
        public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("-----doAround.invoke-----");
            System.out.println(" 此处可以做类似于Before的事情");
     
            // 调用核心逻辑
            Object retVal = pjp.proceed();
            System.out.println(" 此处可以做类似于After的事情");
            System.out.println("-----End of doAround()------");
            return retVal;
        }
     
        /**
         * After 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice
         * 
         * @param joinPoint
         */
        @After(value = "aspectjMethod()")
        public void doAfter(JoinPoint joinPoint) {
            System.out.println("-----doAfter.invoke-----");
            System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等");
            System.out.println(" 可通过joinPoint来获取所需要的内容");
            System.out.println("-----End of doAfter()------");
        }
     
        /**
         * AfterReturning 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice
         * 
         * @param joinPoint
         */
        // @AfterReturning(value = "aspectjMethod()", returning = "retVal")
        public void doReturn(JoinPoint joinPoint, String retVal) {
            System.out.println("-----doReturn().invoke-----");
            System.out.println("Return Value: " + retVal);
            System.out.println(" 此处可以对返回值做进一步处理");
            System.out.println(" 可通过joinPoint来获取所需要的内容");
            System.out.println("-----End of doReturn()------");
        }
     
        /**
         * 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息
         * 
         * 注意:执行顺序在Around Advice之后
         * 
         * @param joinPoint
         * @param ex
         */
        // @AfterThrowing(value = "aspectjMethod()", throwing = "ex")
        public void doThrowing(JoinPoint joinPoint, Exception ex) {
            System.out.println("-----doThrowing().invoke-----");
            System.out.println(" 错误信息:" + ex.getMessage());
            System.out.println(" 此处意在执行核心业务逻辑出错时,捕获异常,并可做一些日志记录操作等等");
            System.out.println(" 可通过joinPoint来获取所需要的内容");
            System.out.println("-----End of doThrowing()------");
        }
    }
    5. [代码]测试TestAop.java     
    
    package com.jack.test;
     
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
     
    import com.jack.bus.IUserManager;
     
    public class TestAop {
        public static void main(String[] args) {
            ApplicationContext ac = new FileSystemXmlApplicationContext(
                    "src/applicationContext.xml");
            /*
             * 编写测试类时注意这里需要把类型转换为接口
             */
            IUserManager manager = (IUserManager) ac.getBean("userManager");
            manager.addUser();
        }
    }
  • 相关阅读:
    第一次作业
    第0次作业
    第14、15周作业
    第七周作业
    第六周作业
    第四周作业
    第三周作业
    第4次作业
    第3次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/hephec/p/5489108.html
Copyright © 2011-2022 走看看