初探aop

本文深入浅出地介绍了面向切面编程(AOP)的概念及其在实际项目中的应用。通过具体示例,展示了如何利用Spring框架实现前置通知、后置通知、环绕通知及异常通知等AOP特性,帮助开发者更好地理解并掌握AOP编程。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值