初探aop

来源:互联网 发布:linux netcat rpm下载 编辑:程序博客网 时间:2024/05/18 00:15
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

原创粉丝点击