初探aop

    技术2022-05-18  26

    AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充! 还是拿人家经常举的一个例子讲解一下吧: 比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录, 我们写个例子看看我们最简单的解决方案

    EmpService接口

    package cn.csdn.service;

     

    public interface EmpService {

     

        void work(String name);

     

    }

    实现类

    package cn.csdn.service;

     

    public class EmpServiceImpl implements EmpService {

     

        private String worktime;

     

        public EmpServiceImpl() {

        }

     

        public void setWorktime(String worktime) {

           this.worktime = worktime;

        }

     

        @Override

        public void work(String name) {

           /**

            * String str = null; str.toString();

            **/

           System.out.println(worktime + "  ===" + name);

     

        }

     

     

    }

    前置通知写法

    package cn.csdn.aop.advice;

     

    import java.lang.reflect.Method;

     

    import org.springframework.aop.MethodBeforeAdvice;

     

    /**前置通知(方法执行之前)*/

    public class MyBeforeAdvice implements MethodBeforeAdvice{

     

           /**第一个参数是:方法 

            * 第二个参数是:方法的参数

            * 第三个参数是:目标对象*/

           @Override

           public void before(Method arg0, Object[] arg1, Object arg2)

                         throws Throwable {

                  System.out.println("方法的名称是:"+arg0);

                  System.out.println("方法的参数"+arg1.length+arg1[0]);

                  System.out.println("目标对象"+arg2);

           }

     

    }

    后置通知写法

    package cn.csdn.aop.advice;

     

    import java.lang.reflect.Method;

     

    import org.springframework.aop.AfterReturningAdvice;

     

    /**后置通知(方法执行之后)*/

    public class MyAfterAdvice implements AfterReturningAdvice {

     

           @Override

           public void afterReturning(Object arg0, Method arg1, Object[] arg2,

                         Object arg3) throws Throwable {

                 

                  System.out.println("方法的返回类型:"+arg0);

                  System.out.println("方法的名称"+arg1+"方法的参数:"+arg2.length+"目标对象:"+arg3.getClass().getName());

     

           }

     

    }

    环绕通知

    package cn.csdn.aop.advice;

     

    import org.aopalliance.intercept.MethodInterceptor;

    import org.aopalliance.intercept.MethodInvocation;

     

    /**环绕通知(方法执行前后)*/

    public class MyAroundAdvice implements MethodInterceptor {

     

        @Override

        public Object invoke(MethodInvocation invocation) throws Throwable {

           System.out.println("around start");

     

           Object obj = invocation.proceed();// 让它去执行目标方法

          

           System.out.println("around end");

           return obj;

        }

     

    }

    异常通知写法

    package cn.csdn.aop.advice;

     

    import java.lang.reflect.Method;

     

    import org.springframework.aop.ThrowsAdvice;

     

    /**

     * 异常通知(方法产生bug)*/

    public class MyException implements ThrowsAdvice{

       

        /**写方法的时候一定参考API中的方法样式 不能够随意写*/

        public void afterThrowing(Method method, Object[] args, Object target, Exception ex){

           System.out.println("方法的名称:"+method+"方法的参数"+args.length+"目标对象:"+target.getClass().getName()+"异常"+ex.getMessage());

        }

     

    }

     

    配置文件写法

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

        <!-- 前置通知(方法操作之前进行处理) -->

        <bean id="myBeforeAdvice" class="cn.csdn.aop.advice.MyBeforeAdvice"

           scope="singleton" />

        <!-- 后置通知(方法的操作之后进行处理) -->

        <bean id="myAfterAdvice" class="cn.csdn.aop.advice.MyAfterAdvice" scope="singleton"/>

        <!-- 环绕通知(方法执行前后处理) -->

        <bean id="myAroundAdvice" class="cn.csdn.aop.advice.MyAroundAdvice" scope="singleton"/>

        <!-- 异常通知(方法执行期间出现bug的时候) -->

        <bean id="myException" class="cn.csdn.aop.advice.MyException" scope="singleton"/>

     

        <!-- 目标对象 -->

        <bean id="empServiceTarget" class="cn.csdn.service.EmpServiceImpl">

           <property name="worktime">

               <value>8小时</value>

           </property>

        </bean>

     

     

        <!-- 代理对象 -->

        <bean id="proxyEmpService" class="org.springframework.aop.framework.ProxyFactoryBean">

           <!-- 代理的接口 -->

           <property name="proxyInterfaces">

               <list>

                  <value>cn.csdn.service.EmpService</value>

               </list>

           </property>

           <!-- 代理 拦截通知的集合-->

           <property name="interceptorNames">

               <list>

                  <value>myBeforeAdvice</value>

                  <value>myAfterAdvice</value>

                  <value>myAroundAdvice</value>

                  <value>myException</value>

               </list>

           </property>

          

           <!-- 代理 拦截通知的集合 -->

           <property name="interceptorNames">

               <list>

                  <value>slpbeforeAdivce</value>

                  <value>myAfterAdvice</value>

                  <value>wkAroundAdivce</value>

                  <value>myException</value>

                  <value>defaultIntroductionAdvisor</value>

               </list>

           </property>

           <!-- 指明目标对象 -->

           <property name="target">

               <ref bean="empServiceTarget" />

           </property>

        </bean>

     

    </beans>

     

    测试类

    package cn.csdn.service;

     

    import java.sql.Date;

     

    import org.junit.Test;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

     

    public class App {

     

        @Test

        public void test() {

           ApplicationContext ac = new ClassPathXmlApplicationContext(

                  "classpath:app*.xml");

     

           EmpService empService = (EmpService) ac.getBean("proxyEmpService");

     

           empService.work("ss");

          

        }

     

    }

     

    输出信息

    around start

    8小时  ===ss

    around end

    方法的返回类型:null

    方法的名称public abstract void cn.csdn.service.EmpService.work(java.lang.String)方法的参数:1目标对象:cn.csdn.service.EmpServiceImpl

     


    最新回复(0)