初探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
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
- AOP初探
- 初探aop
- 初探aop
- 初探Spring AOP framework
- Spring AOP 初探
- Spring AOP 用法初探
- Spring AOP 初探
- Spring AOP 初探
- C#之AOP初探
- 初探Spring AOP
- 初探spring aop内部实现
- Spring AOP初探(二)
- MVC过滤器-AOP思想初探
- spring AOP 动态代理初探
- Spring Aop 初探(2)
- Spring Aop 初探(1)
- Spring Aop 初探(3)
- Spring Aop 初探(4)
- 堆和栈的区别
- javascript设计模式
- Source Insight建工程之Uboot
- 浅谈人人网以及淘宝网的IM即时通信以及point-to-point通信
- 命令行或者Console程序中文字颜色控制
- 初探aop
- 【几何---正方形覆盖】hdu 4007
- 为了您的健康,请对电脑作如下设置!
- 游戏中的架构
- innodb引擎Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
- Gootip让Twitter成为基于地理位置的问答平台,并发布iPhone应用
- 适配器模式和外观模式
- hibernate查询(模糊查询、子查询等)
- 工厂方法模式