• AOP的基于xml配置的方式实现


    一、创建一个接口

    public interface MyMath {
    public int add(int i,int j);
    public void sub(int i,int j);
    public void mul(int i,int j);
    public void div(int i,int j);
    }
    

    二、创建一个接口的实现类

    @Component
    public class MathCalculatorImp limplements MyMath{
    
        @Override
        public int add(int i, int j) {
            int result=i+j;
            System.out.println("目标方法add执行了, "+result);
            return result;
            
        }
    
        @Override
        public void sub(int i, int j) {
            // TODO Auto-generated method stub
            int result=i-j;
            System.out.println("目标方法sub执行了, "+result);
        }
    
        @Override
        public void mul(int i, int j) {
            // TODO Auto-generated method stub
            int result=i*j;
            System.out.println("目标方法mul执行了, "+result);
        }
    
        @Override
        public void div(int i, int j) {
            // TODO Auto-generated method stub
            int result=i/j;
            System.out.println("目标方法div执行了, "+result);
        }
    }

    三、创建切面类

    @Aspect//表示这是一个切面类
    		@Component//将本类对象加入到IOC容器中!
    		public class LogAspect {
    			public void showBeginLog(){
    				System.out.println("AOP日志开始");
    			}
    			
    			public void showReturnLog(){
    				System.out.println("AOP方法返回");
    			}
    			
    			public void showExceptionLog(){
    				System.out.println("AOP方法异常");
    			}
    			
    			public void showAfterLog(){
    				System.out.println("AOP方法结束");
    			}
    		}
    

      或者环绕通知


    .环绕通知:@Around

    1.环绕通知需要在方法的参数中指定JoinPoint的子接口类型ProceedingJoinPoint为参数

    2.环绕通知会将其他4个通知能干的,自己都给干了! 注意:@Around修饰的方法一定要将方法的返回值返回!本身相当于代理! public Object around(ProceedingJoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); Signature signature = joinPoint.getSignature(); String methodName = signature.getName(); List<Object> list = Arrays.asList(args); Object result = null; try { //目标方法之前要执行的操作 System.out.println("[环绕日志]"+methodName+"开始了,参数为:"+list); //调用目标方法 result = joinPoint.proceed(args); //目标方法正常执行之后的操作 System.out.println("[环绕日志]"+methodName+"返回了,返回值为:"+result); } catch (Throwable e) { //目标方法抛出异常信息之后的操作 System.out.println("[环绕日志]"+methodName+"出异常了,异常对象为:"+e); throw new RuntimeException(e.getMessage()); }finally{ //方法最终结束时执行的操作! System.out.println("[环绕日志]"+methodName+"结束了!"); } return result; }

    四、xml的配置

    <!-- 1.将需要加载到IOC容器中的bean配置好 -->
    	<bean id="logAspect" class="com.neuedu.aop.proxy.LogAspect"></bean>
    	<bean id="txAspect" class="com.neuedu.aop.target.TxAspect"></bean>
    	<bean id="calculator" class="com.neuedu.aop.target.MathCalculatorImpl"></bean>
    	
    	<!-- 2.配置AOP,需要导入AOP名称空间 -->
    	<aop:config>
    
    	   <!-- 声明切入点表达式 -->
    	   <aop:pointcut expression="execution(* com.neuedu.aop.target.MathCalculatorImpl.*(..))" id="myPointCut"/>
    	   <!-- 配置日志切面类,引用前面的类 ,通过order属性控制优先级-->
    	   <aop:aspect ref="logAspect" order="25">
    	  	 	<!-- 通过method属性指定切面类的切面方法,通过pointcut-ref指定切入点表达式 -->
    	   		<aop:before method="showBeginLog" pointcut-ref="myPointCut"/>
    	   		<aop:after method="showAfterLog" pointcut-ref="myPointCut"/>
    	   		<aop:after-throwing method="showExceptionLog" pointcut-ref="myPointCut" throwing="ex"/>
    	   		<aop:after-returning method="showReturnLog" pointcut-ref="myPointCut" returning="result"/>
    	   		<aop:around method="around" pointcut-ref="myPointCut"/>
    	   </aop:aspect>
    	   
    	   	   <!-- 配置事务切面类,引用前面的类 -->
    	   <aop:aspect ref="txAspect" order="20">
    	   		<aop:around method="around" pointcut-ref="myPointCut"/>
    	   </aop:aspect>
    	</aop:config>
    

      

  • 相关阅读:
    数组
    数据结构的三个方面
    java数据结构和算法
    HashMap实现原理
    面试必问---HashMap原理分析
    Java中:>>>和>>区别
    java运算符 与(&)、非(~)、或(|)、异或(^)
    Java集合详解(全)
    String、StringBuffer、StringBuilder的区别
    abstract关键字、final关键字、static关键字、访问修饰符详解
  • 原文地址:https://www.cnblogs.com/xuesheng/p/7691442.html
Copyright © 2020-2023  润新知