增强类· MyAspect
package com.on.aspect;
public class MyAspect {
//前置增强
public void before(){
System.out.println(“前置增强”);
}
//最终增强
public void after(){
System.out.println(“最终增强”);
}
//后置增强
public void afterReturn(){
System.out.println(“后置增强”);
}
//环绕增强
public void round(){
System.out.println(“环绕增强”);
}
//异常增强
public void exrction(){
System.out.println(“异常增强”);
}
}
DAO接口
package com.on.dao;
public interface Opreate {
void add(int num1,int num2);
void del(int num1,int num2);
void cheng(int num1,int num2);
void chu(int num1,int num2);
}
OpreateImpl 继承Opreate接口 重写方法
package com.on.dao.impl;
import com.on.dao.Opreate;
public class OpreateImpl implements Opreate{
@Override
public void add(int num1, int num2) {
System.out.println(num1+num2);
}
@Override
public void del(int num1, int num2) {
System.out.println(num1-num2);
}
@Override
public void cheng(int num1, int num2) {
System.out.println(num1*num2);
}
@Override
public void chu(int num1, int num2) {
System.out.println(num1/num2);
}
}
JDK代理类
package com.on.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.on.aspect.MyAspect;
import com.on.dao.Opreate;
public class JdkProxy implements InvocationHandler{
private Opreate opreate;
/***
* 返回代理对象
* @param userDao
* @return
*/
public Object createProxy(Opreate opreate){
this.opreate=opreate;
//获取当前类的类加载器
ClassLoader classLoader=JdkProxy.class.getClassLoader();
//获取被代理对象所实现的接口
Class[] clazz=opreate.getClass().getInterfaces();
//利用Proxy创建目标对象的动态代理
return Proxy.newProxyInstance(classLoader,clazz,this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//创建切面对象
MyAspect myAspect=new MyAspect();
myAspect.before();
Object obj=method.invoke(opreate, args);
myAspect.afterReturn();
return obj;
}
}
配置 applicationContext.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
aop:config
<aop:pointcut expression=“execution(* com.on.dao.impl..(…))” id=“pointcut”/>
<aop:aspect ref=“myAspect”>
<aop:before method=“before” pointcut-ref=“pointcut”/>
<aop:after-returning method=“afterReturn” pointcut-ref=“pointcut”/>
</aop:aspect>
</aop:config>
测试类
package com.on.test;
import static org.junit.Assert.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.on.dao.Opreate;
import com.on.dao.impl.OpreateImpl;
import com.on.jdk.JdkProxy;
public class Test {
@org.junit.Test
public void test() {
String path="applicationContext.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(path);
Opreate op=(Opreate)applicationContext.getBean("op");
op.add(1,2);
}
@org.junit.Test
public void test1() {
Opreate opreate=new OpreateImpl();
JdkProxy jdk=new JdkProxy();
//返回一个代理对象
Opreate proxyOp=(Opreate) jdk.createProxy(opreate);
proxyOp.add(1,2);
proxyOp.cheng(1,2);
}
}