博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初探aop
阅读量:4220 次
发布时间:2019-05-26

本文共 4618 字,大约阅读时间需要 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

转载地址:http://xnlmi.baihongyu.com/

你可能感兴趣的文章
BMS 历史数据存储方案分析
查看>>
【规划】关于A*、LPA*、D* Lite算法的小结
查看>>
TOML 教程 - 可能是目前最好的配置文件格式
查看>>
GCC自带的一些builtin内建函数
查看>>
c++高效位运算函数之 __builtin_
查看>>
popcount 算法分析
查看>>
一种实用的popcount实现方法
查看>>
slickedit快捷键冲突问题
查看>>
[讨论] AUTOCAD二次开发简介
查看>>
关于AutoCAD的dwg文件操作学习
查看>>
System::String转换为std::string
查看>>
C与C++中IO流的比较
查看>>
VS2010 警告 1 warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s
查看>>
vs2010 c++ 学习笔记
查看>>
C++类和new、delete操作符
查看>>
浅谈 C++ 中的 new/delete 和 new[]/delete[]
查看>>
关于“为什么delete以后指针还能被赋值”一种描述
查看>>
C++常用库(转)
查看>>
c/c++内存释放知识总结
查看>>
马云说:员工的离职原因
查看>>