好久没学习spring了,今天接着学习。
接着这上面的例子,在上面的例子中我们的UserManagerImpl类是实现了UserManager接口,如果UserManagerImpl没有实现任何接口要怎么办呢?应为创建代理对象时我们需要指定接口的。
Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
由于没有时间接口,因此我们是不能这样创建代理接口的,这是我们需要借助第三方包来实现。在spring中提供了cglib-nodep-2.1_3.jar包。我们通过cglib创建代理对象。
下面就通过实例演示通过cglib创建代理对象。
首先创建CGlibProxyFactory,实现MethodInterceptor接口,接口中有一个intercept方法,当代理对象的方法被调用时会调用这个方法。
package com.szy.spring;
import java.lang.reflect.Method;
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 newProxy(Object targetObject)
{
this.targetObject=targetObject;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
//返回代理对象
return enhancer.create();
}
/**
* proxy 带来对象本身
* method 被拦截到的方法
* args 方法的参数
* methodProxy 方法的代理对象
*/
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable
{
checkSecurity();
Object ret=null;
try
{
//调用目标对象的真实方法
ret=method.invoke(this.targetObject, args);
//ret接受存在的返回值,不存在返回值则为Null
} catch (Exception e)
{
e.printStackTrace();
}
return ret;
}
public void checkSecurity()
{
System.out.println("--------UserManagerImpl.checkSecurity()----------");
}
}
其实整个代码很前面的很相似,只是创建代理对象的方法不一样。
测试代码:
CGlibProxyFactory factory=new CGlibProxyFactory();
//创建代理对象,这是这个代理对象是UserManagerImpl的子类
UserManagerImpl userManager=(UserManagerImpl)factory.newProxy(new UserManagerImpl());
userManager.addUser("coolszy", "kuka");
上面演示的几个事例是不借助与任何框架的情况下实现AOP的方法。
分享到:
相关推荐
spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar 需要的拿走吧
spring源码缺失jar。spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar
spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar
spring源码导入SpringObjenesis类报错解决,缺少jar包spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.1.jar
Spring AOP实现方法之一:CGLIB 实现AOP功能
spring源码编译之后,各个项目可能缺失jar包 spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.5.1.jar
Spring源码阅读环境缺少的jar包
spring4.0源码编译时缺失的两个jar包,spring-cglib-repack-3.1.jar,spring-objenesis-repack-2.1.jar
spring-cglib-repack-3.2.6.jar 文件大小:313502 字节 修改时间:2018年8月26日 09:12:09 MD5 :1F3A42309EC16632954291B584778432 SHA1 :7A9601D36541798180C2AFC4DA34A78237F5C0AA CRC32 :675C7EB7 spring-...
这里zip压缩包囊括了学习Spring过程中用到的所有的jar包; 有: commons-logging-1.2.jar spring-beans-4.0.4.RELEASE.jar spring-context-4.0.4.RELEASE.jar spring-core-4.0.4.RELEASE.jar spring-expression-...
org.springframework.asm.AnnotationVisitor org.springframework.cglib.core.ClassGenerator
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...
Spring源码缺失的spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar
spring4源码所需要的spring-objenesis-repack-2.1.jar,spring-cglib-repack-3.1.jar
Spring-AOP-利用java中的动态代理和Spring的拦截器做到AOP
idea构建spring源码,所缺少的2个jar包。spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jar
2018-02-08从git_hub上拉取的Spring源码打成的jar,构建Spring-beans5.0以上源码所缺失的两个jar包spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jar
spring源码深度分析源码依赖,将cglib和objenesis重新打包处理。同时添加grandle依赖:compile fileTree(dir: 'libs', include: ['*.jar'])
Spring源码导入Eclipse缺失Jar包spring-asm-repack-5.0.4+spring-cglib-repack-3.1