当前位置:首页 » 代理许可 » spring动态代理

spring动态代理

发布时间: 2021-02-12 18:02:06

❶ spring的动态代理有几种实现方式

JAVA 代理实现

代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装。

动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式。


JDK自带实现方法

JDK实现代理生成,是用类 java.lang.reflect.Proxy, 实现方式如下

EX:

publicclassJDKProxy{
(finalObjectc){
returnProxy.newProxyInstance(c.getClass().getClassLoader(),c.getClass().getInterfaces(),//JDK实现动态代理,但JDK实现必须需要接口
newInvocationHandler(){
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
//TODOAuto-generatedmethodstub
ObjectreObj=null;
System.out.print("yousay:");
reObj=method.invoke(c,args);
System.out.println("["+Calendar.getInstance().get(Calendar.HOUR)+":"
+Calendar.getInstance().get(Calendar.MINUTE)+""
+Calendar.getInstance().get(Calendar.SECOND)+"]");
returnreObj;
}
});
}
}

测试代理类方法

publicclassTestForPoxy{
publicstaticvoidmain(String[]args){
ServiceTestservice=newServiceTestImpl();
System.out.println(service.getClass().getSimpleName());
ServiceTestpoxyService=(ServiceTest)JDKProxy.getPoxyObject(service);
System.out.println(poxyService.getClass().getSuperclass());
poxyService.saySomething("hello,MyQQcodeis107966750.");
poxyService.saySomething("what'syourname?");
poxyService.saySomething("onlyfortest,hehe.");
}
}

1, Proxy实现代理的目标类必须有实现接口

2, 生成出来的代理类为接口实现类,和目标类不能进行转换,只能转为接口实现类进行调用

明显特点:通过此方法生成出来的类名叫做 $Proxy0


用CGLIB包实现

CGLIB是一个开源项目,官方网址是:http://cglib.sourceforge.net/,可以去上面下载最新JAR包,

本项目用的是cglib-3.0.jar

本项目还加入了依赖JAR包asm-4.0.jar,asm-util-4.0.jar

实现方式如下

EX:

publicclassCGLIBProxy{
(Objectc){
Enhancerenhancer=newEnhancer();
enhancer.setSuperclass(c.getClass());
enhancer.setCallback(newMethodInterceptor(){
publicObjectintercept(Objectarg0,Methodarg1,Object[]arg2,MethodProxyproxy)throwsThrowable{
System.out.print("yousay:");
proxy.invokeSuper(arg0,arg2);
System.out.println("["+Calendar.getInstance().get(Calendar.HOUR)+":"
+Calendar.getInstance().get(Calendar.MINUTE)+""+Calendar.getInstance().get(Calendar.SECOND)
+"]");
returnnull;
}
});
returnenhancer.create();
}
}

测试代理类方法

publicclassTestForPoxy{
publicstaticvoidmain(String[]args){
ServiceTestservice=newServiceTestImpl();
System.out.println(service.getClass().getSimpleName());
//ServiceTestpoxyService=(ServiceTest)JDKProxy.getPoxyObject(service);
ServiceTestpoxyService=(ServiceTest)CGLIBProxy.getPoxyObject(service);
System.out.println(poxyService.getClass().getSuperclass());
poxyService.saySomething("hello,MyQQcodeis107966750.");
poxyService.saySomething("what'syourname?");
poxyService.saySomething("onlyfortest,hehe.");
}
}

1, CGLIB实现方式是对代理的目标类进行继承

2, 生成出了的代理类可以没方法,生成出来的类可以直接转换成目标类或目标类实现接口的实现类,因JAVA向上转换

明显特点:通过输出看出,看出生成出的代理类的parent类为代理的目标类

❷ 如何在spring容器里注册自定义的动态代理生成的对象(类似mybatis的注入)

请问有解决了吗?我也在看这块,你看看我这种方法行不行:
@n
@ComponentScan(basePackages = "com.minsx.spring.jpatemplateb")
public class AppConfig implements ApplicationContextAware {

@Autowired
RepositoryProxyFactory repositoryFactory;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
registerBeans(applicationContext);
}

private void registerBeans(ApplicationContext applicationContext) throws BeansException {
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(getUserRepositoryProxy().getClass());
defaultListableBeanFactory.registerBeanDefinition("userRepository", beanDefinitionBuilder.getBeanDefinition());
}

private UserRepository getUserRepositoryProxy() {
System.out.println(JSON.toJSONString(repositoryFactory.getProxyByClass(UserRepository.class).findUserByName("goodsave")));
return repositoryFactory.getProxyByClass(UserRepository.class);
}

}

❸ jdk 动态代理与spring 动态代理区别

spring有两种动态代理方式,一种就是jdk动态代理,还有就是cglib动态代理,jdk动态代理只能代理接口,cglib可以是类。jdk代理生成速度比cglib快,性能没有cglib好

❹ Spring 动态代理问题!

首先,这是抄动态代理,但是和spring里面的AOP没有直接关系.
你还是做的是java本身的"动态代理".

因为你做的是动态代理,所以你的类必须实现InvocationHandler接口.
自然,你的实现类"Daili"就必须实现invoke()方法,这个方法是在你调用被代理对象的时候自动执行的,所以不需要你显式调用.

实际过程是你要执行被代理对象里面的某个method,这是你的目的(卖电脑),这时你要通过代理对象来做,因为代理对象可以做一些其他的事情(比如:送橘子).

"卖电脑"和"送橘子"是一次营销活动的组成部分,送完橘子你必须还要给人家电脑,这个invoke()方法就是在你送橘子的前、中、后去卖电脑,这个才是主要目的.

invoke()方法的参数列表是:Object proxy, Method method, Object[] args
指的是:被代理对象, 要执行的被代理对象中的方法, 要执行的方法中的参数列表

具体到你的例子:卖电脑的业务类, 卖电脑的那个方法, 卖电脑需要的一些数据

返回的是'卖电脑的那个方法'返回的数据,因为在编程时不知道运行时会去代理什么,所以参数列表是个对象数组,返回的是个对象.

❺ Spring框架的动态代理是干什么用的

主要就是解耦和。还有提高开发效率。易于修改啊。
比如 一段记录日志的代码。loger.log("some mothed invoke at "+new Date()); 没有什么难事。但是你所有方法。你都复制一下?那个太不靠谱了。
嗯。这个就是Java 模式 中的 代理模式。你可以看一下。看看那个。你就知道了spring 的代理。嗯。spring的代理,有两种机制,一中是jdk的Proxy 还有一个是cglib 这个是基于集成实现的。嗯。就是super 使用重写方法。然后在重写方法中加入 super.thisMethod();
耦合度太高的话就会对你的程序未来升级带来恨大的麻烦。嗯。说实话啊。嗯。你的项目要是一顶保证永不改变。那么完全可以不管这个耦合度的问题。但是,jdk的升级。还有其他框架啊。技术的升级。都会对你 的系统带来问题。和升级空间。所以,降低耦合度就是一直在做的。

❻ spring中aop的动态代理机制有哪些

1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物
2.日志处理:
3.安全验证: Spring AOP---OOP升级

静态代理原理:目标对象:调用业务逻辑 代理对象:日志管理
表示层调用--->代理对象(日志管理)-->调用目标对象

动态代理原理:spring AOP采用动态代理来实现
(1)实现InvocationHandler接口
(2)创建代理类(通过java API)

❼ spring动态代理有什么作用

可以在你执行被代理对象里面的某个method前后自动执行任意你规定的代码,而回不影响method其他相邻方法的执行答,使代码程序低耦合。
也可以写一个不依赖与其他模块的日志管理模块,然后用AOP来把这个模块跟数据库操作模块挂钩,在数据操作的同时也通过AOP功能自动的记录了数据库操作日志。 当不需要日志时,可直接移除而不影响其他的代码。

❽ 如何将动态代理对象注入到spring

建议你把Proxy.newProxyInstance写到一个工厂类里面(因为其实Proxy.newInstance本身就是工厂模式)

❾ Spring的两种动态代理有什么区别

JAVA 代理实现
代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装。
动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式。

❿ spring对AOP的支持 JDK动态代理和CGLIB的区别

Aspect默认情况下不来用实现接口,但对源于目标对象(UserManagerImpl.java),在默认情况下必须实现接口
如果没有实现接口必须引入CGLIB库

我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得
参数值、方法名等等

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

如何强制使用CGLIB实现AOP?
* 添加CGLIB库,SPRING_HOME/cglib/*.jar
* 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

JDK动态代理和CGLIB字节码生成的区别?
* JDK动态代理只能对实现了接口的类生成代理,而不能针对类
* CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final

热点内容
美发店认证 发布:2021-03-16 21:43:38 浏览:443
物业纠纷原因 发布:2021-03-16 21:42:46 浏览:474
全国著名不孕不育医院 发布:2021-03-16 21:42:24 浏览:679
知名明星确诊 发布:2021-03-16 21:42:04 浏览:14
ipad大专有用吗 发布:2021-03-16 21:40:58 浏览:670
公务员协议班值得吗 发布:2021-03-16 21:40:00 浏览:21
知名书店品牌 发布:2021-03-16 21:39:09 浏览:949
q雷授权码在哪里买 发布:2021-03-16 21:38:44 浏览:852
图书天猫转让 发布:2021-03-16 21:38:26 浏览:707
宝宝水杯品牌 发布:2021-03-16 21:35:56 浏览:837