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();
        }
    }
  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/hephec/p/5489108.html
Copyright © 2011-2022 走看看