模拟spring,Aop(JDK与CGLib两种方式实现)
2017-10-12 13:25
741 查看
一、AOP以JDK版实现
1.定义接口
package cn.hq.service;
public interface StudentService {
public String getUser() throws Exception;
public void save(String name) throws Exception;
public void update(String name) throws Exception;
}
2.接口实现
package cn.hq.service.impl;
import cn.hq.service.StudentService;
public class StudentServiceImpl implements StudentService {
private String user;
public String getUser() {
return user;
}
public StudentServiceImpl() {}
public StudentServiceImpl(String user) {
this.user = user;
}
public void save(String name) throws Exception {
System.out.println("save()==>" + name);
}
public void update(String name) {
System.err.println("update()==>" + name);
}
}
3.代理类工厂
package cn.hq.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.hq.service.StudentService;
public class JDKProxyFactory implements InvocationHandler{
private Object targetObject;
public JDKProxyFactory() {}
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(
this.targetObject.getClass().getClassLoader(), //类加载器
this.targetObject.getClass().getInterfaces(), //类中的所有接口
this); //当前对象 此处较为重要 通过此处回调 invoke函数
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { //--环绕通知
StudentService bean = (StudentService)this.targetObject;
Object result = null;
if(bean.getUser() != null) {
//---spring中的advice()---前置通知
try {
result = method.invoke(targetObject, args);
//afterAdivice()-----后置通知
} catch (Exception e) {
// exceptionAdivce()---异常通知
}finally {
//finallyAdive()----后置通知
}
}
return result;
}
}
4.测试
@Test
public void proxyTest() {
JDKProxyFactory factory =new JDKProxyFactory();
StudentService studentService = (StudentService) factory.createProxyInstance(new StudentServiceImpl("zzz"));
try {
if(studentService.getUser() != null && !"".equals(studentService.getUser())) {
studentService.save("dddd");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
}
}
二、AOP以CGLib实现
1.定义方法类
package cn.hq.service.impl;
public class TeacherServiceBean {
private String user;
public String getUser() {
ret
4000
urn user;
}
public void setUser(String user) {
this.user = user;
}
public void save() throws Exception{
System.out.println(this.getClass().getName() + "====>save()");
}
}
2.代理类工厂
package cn.hq.aop;
import java.lang.reflect.Method;
import cn.hq.service.impl.TeacherServiceBean;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGlibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass()); //非Final
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable { //--环绕通知
TeacherServiceBean teacherServiceBean = (TeacherServiceBean)this.targetObject;
Object result = null;
if(teacherServiceBean.getUser() != null) {
//---spring中的advice()---前置通知
try {
result = methodProxy.invoke(targetObject, args);
//afterAdivice()-----后置通知
} catch (Exception e) {
// exceptionAdivce()---异常通知
}finally {
//finallyAdive()----后置通知
}
}
return result;
}
}
3.测试
@Test
public void cglibProxyTest() {
CGlibProxyFactory factory =new CGlibProxyFactory();
TeacherServiceBean bean = (TeacherServiceBean) factory.createProxyInstance(new TeacherServiceBean());
try {
bean.save();
} catch (Exception e) {
e.printStackTrace();
}finally{
}
}
4.注,CGLib实现需要添加jar包
asm-3.3.1.jar
cglib-2.2.2.jar
三、两者的区别
JDK版的代理实现,方法类必须要有接口实现。。采用的动态代理的方式
CGLib不需要实现接口。。具体是使用继承的重载的方式
1.定义接口
package cn.hq.service;
public interface StudentService {
public String getUser() throws Exception;
public void save(String name) throws Exception;
public void update(String name) throws Exception;
}
2.接口实现
package cn.hq.service.impl;
import cn.hq.service.StudentService;
public class StudentServiceImpl implements StudentService {
private String user;
public String getUser() {
return user;
}
public StudentServiceImpl() {}
public StudentServiceImpl(String user) {
this.user = user;
}
public void save(String name) throws Exception {
System.out.println("save()==>" + name);
}
public void update(String name) {
System.err.println("update()==>" + name);
}
}
3.代理类工厂
package cn.hq.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.hq.service.StudentService;
public class JDKProxyFactory implements InvocationHandler{
private Object targetObject;
public JDKProxyFactory() {}
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(
this.targetObject.getClass().getClassLoader(), //类加载器
this.targetObject.getClass().getInterfaces(), //类中的所有接口
this); //当前对象 此处较为重要 通过此处回调 invoke函数
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { //--环绕通知
StudentService bean = (StudentService)this.targetObject;
Object result = null;
if(bean.getUser() != null) {
//---spring中的advice()---前置通知
try {
result = method.invoke(targetObject, args);
//afterAdivice()-----后置通知
} catch (Exception e) {
// exceptionAdivce()---异常通知
}finally {
//finallyAdive()----后置通知
}
}
return result;
}
}
4.测试
@Test
public void proxyTest() {
JDKProxyFactory factory =new JDKProxyFactory();
StudentService studentService = (StudentService) factory.createProxyInstance(new StudentServiceImpl("zzz"));
try {
if(studentService.getUser() != null && !"".equals(studentService.getUser())) {
studentService.save("dddd");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
}
}
二、AOP以CGLib实现
1.定义方法类
package cn.hq.service.impl;
public class TeacherServiceBean {
private String user;
public String getUser() {
ret
4000
urn user;
}
public void setUser(String user) {
this.user = user;
}
public void save() throws Exception{
System.out.println(this.getClass().getName() + "====>save()");
}
}
2.代理类工厂
package cn.hq.aop;
import java.lang.reflect.Method;
import cn.hq.service.impl.TeacherServiceBean;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGlibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass()); //非Final
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable { //--环绕通知
TeacherServiceBean teacherServiceBean = (TeacherServiceBean)this.targetObject;
Object result = null;
if(teacherServiceBean.getUser() != null) {
//---spring中的advice()---前置通知
try {
result = methodProxy.invoke(targetObject, args);
//afterAdivice()-----后置通知
} catch (Exception e) {
// exceptionAdivce()---异常通知
}finally {
//finallyAdive()----后置通知
}
}
return result;
}
}
3.测试
@Test
public void cglibProxyTest() {
CGlibProxyFactory factory =new CGlibProxyFactory();
TeacherServiceBean bean = (TeacherServiceBean) factory.createProxyInstance(new TeacherServiceBean());
try {
bean.save();
} catch (Exception e) {
e.printStackTrace();
}finally{
}
}
4.注,CGLib实现需要添加jar包
asm-3.3.1.jar
cglib-2.2.2.jar
三、两者的区别
JDK版的代理实现,方法类必须要有接口实现。。采用的动态代理的方式
CGLib不需要实现接口。。具体是使用继承的重载的方式
相关文章推荐
- Spring中AOP实现的两种方式之JDK和cglib的动态代理
- spring aop提供了两种实现方式jdk和cglib
- Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理
- Spring中AOP实现的两种方式之JDK和cglib的动态代理
- Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载
- 使用jdk和cglib实现spring的aop功能
- Spring AOP实现方式 - JDK动态代理和CGLIB动态代理
- Spring的两种代理方式:JDK动态代理和CGLIB动态代理
- 动态代理及其两种实现方式(JDK、CGLIB)
- AOP的实现方式比较,cglib vs jdk
- SpringAOP的两种实现方式
- 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理
- 使用jdk和cglib实现spring的aop功能
- 动态代理的两种实现方式(JDK/Cglib)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- 转:Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- springAOP的两种方式JdkDynamicAopProxy和Cglib2AopProxy源码解析
- spring实现AOP的两种方式以及实现动态代理方式
- spring对AOP的支持(JDK的动态代理实现AOP和CGLIB实现AOP)