当前位置: 首页 > news >正文

怎么去做推广百度首页优化排名

怎么去做推广,百度首页优化排名,西安大型网站建设,企业网站登录入口官网面对新鲜事物,我们要先了解在去探索事物的本质-默 目录 一.介绍二者代理模式 1.1.Jdk代理模式 1.2cglib代理模式 1.3二者区别 1.3.1有无接口 1.3.2灵活性 1.4对于两种代理模式的总结 1.4.1jdk代理模式 1.4.2cglib代理模式 二.两种代理模式应用场景 2.1jd…

面对新鲜事物,我们要先了解在去探索事物的本质-默

目录

一.介绍二者代理模式

1.1.Jdk代理模式

1.2cglib代理模式

1.3二者区别

1.3.1有无接口

1.3.2灵活性

1.4对于两种代理模式的总结

1.4.1jdk代理模式

1.4.2cglib代理模式

二.两种代理模式应用场景

2.1jdk代理模式应用场景

2.1.1基于接口的代理

2.1.2细粒度的方法拦截

2.2cglib代理模式应用场景

2.2.1非基于接口的代理

2.2.2覆盖父类中的方法 

2.2.3高性能的代理 

三.代码演示 

3.1jdk代理模式

3.1.1源码

 3.2思路解释

3.2cglib代理模式

3.2.1源码

 3.2.1思路解释


一.介绍二者代理模式

1.1.Jdk代理模式

JDK代理是通过接口实现的动态代理方式。当目标类实现了至少一个接口时,Spring AOP会使用JDK代理。JDK代理通过在运行时创建一个实现了目标接口的代理类来实现代理功能。代理对象和目标对象实现了同一个接口,因此只能代理接口中定义的方法

1.2cglib代理模式

CGLIB代理是通过继承实现的动态代理方式。当目标类没有实现任何接口时,Spring AOP会使用CGLIB代理。CGLIB代理通过在运行时创建目标类的子类来实现代理功能。代理对象继承自目标对象,并覆盖了目标对象的非final方法,因此可以代理目标对象的所有方法。

1.3二者区别

1.3.1有无接口

JDK代理要求目标类必须实现接口,而CGLIB代理不需要,可以代理普通的Java类。 

1.3.2灵活性

JDK代理基于接口,适用于对接口的代理,更加灵活,但无法代理没有接口的类

CGLIB代理是通过生成目标类的子类来实现代理,适用于对类的代理。CGLIB代理具有更高的性能,因为它不需要通过反射调用目标对象的方法。 

1.4对于两种代理模式的总结

1.4.1jdk代理模式

JDK 动态代理是基于接口的代理方式。它通过创建一个实现了目标接口的代理类,并在代理类中实现代理逻辑。代理类在运行时动态生成,并在其中调用原始对象的方法

JDK 动态代理通过 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现。代理对象是在运行时动态生成的。

无法代理非公有类:JDK 动态代理不能代理那些声明为 final 的类,因为 final 类不能被继承。另外,由于代理类是在运行时动态生成的,因此也无法代理那些没有默认构造函数的类

方法拦截:代理对象在调用方法时,会将方法调用转发给 InvocationHandler 的实现类,在这个实现类中可以添加自定义的逻辑,完成方法的拦截、增强等操作。

性能相对较低:相比于 CGLIB 动态代理,JDK 动态代理的性能较低。这主要是因为 JDK 动态代理需要通过反射来调用目标对象的方法。

总的来说,JDK 动态代理是一种比较常用的代理方式,适用于代理接口的场景,易于使用和理解。但它的局限性在于只能代理实现了接口的类,并且在性能方面稍逊于 CGLIB 动态代理。

1.4.2cglib代理模式

CGLIB 动态代理是一种基于继承的代理方式。它通过创建目标类的子类来实现代理。代理类继承自目标类,并重写其中的方法,在重写的方法中添加了增强逻辑

类代理:CGLIB 动态代理可以代理类,无论是否实现了接口。这使得它可以代理那些没有实现接口的类,不包括 final 类

代理生成:CGLIB 动态代理使用字节码生成库来创建目标类的子类。代理类在运行时动态生成,并且不需要目标类实现任何接口。

方法拦截:被代理的方法在执行时,会调用代理类中的方法。这样,我们可以在代理类中添加拦截器(MethodInterceptor),并在拦截器中实现自定义的逻辑。

性能相对较高:相比于 JDK 动态代理,CGLIB 动态代理的性能更高。这是因为 CGLIB 通过继承来实现代理,避免了反射调用的开销。

对于 final 方法和私有方法的限制:CGLIB 默认无法代理 final 方法,因为 final 方法无法被重写。此外,CGLIB 也不能代理私有方法,因为代理类无法访问目标类的私有方法。但是可以通过设置 CGLIB 的 Enhancer 对象的 setUseReflection(true) 方法来强制代理私有方法。这样一来,CGLIB 将使用反射调用私有方法,但这可能会导致性能下降。

需要注意的是,CGLIB 代理依赖于字节码生成,在代理类生成时会占用一定的时间和内存

总结来说,CGLIB 动态代理适用于代理类的场景,可以代理没有实现接口的类,并且具有较高的性能。

二.两种代理模式应用场景

2.1jdk代理模式应用场景

2.1.1基于接口的代理

如果目标对象实现了接口,可以使用JDK动态代理。它要求目标对象实现一个接口,并且生成的代理对象也会实现相同的接口。

2.1.2细粒度的方法拦截

JDK动态代理可以在目标对象的方法调用前后添加额外的逻辑。例如,在方法调用前打印日志、进行权限验证或事务管理等

2.2cglib代理模式应用场景

2.2.1非基于接口的代理

CGLIB动态代理可以代理没有实现接口的类。因此,当目标对象没有实现任何接口时,可以使用CGLIB动态代理。

2.2.2覆盖父类中的方法 

CGLIB动态代理通过继承目标类并覆盖其中的方法来创建代理对象。这使得它可以代理目标类中的非公有方法。 

2.2.3高性能的代理 

相比JDK动态代理,CGLIB动态代理通常具有更高的性能,因为它直接操作字节码而不需要通过反射调用方法。 

三.代码演示 

3.1jdk代理模式

3.1.1源码

package com.daili.jdk;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @author lz* @create 2023-08-21 9:33*/
public interface UserService {void saveUser(String username);
}
class UserServiceImpl implements UserService {public void saveUser(String username) {System.out.println("Saving user: " + username);}
}class UserServiceProxy implements InvocationHandler {private Object target;public UserServiceProxy(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method: " + method.getName());Object result = method.invoke(target, args);System.out.println("After method: " + method.getName());return result;}
}class Main {public static void main(String[] args) {UserService userService = new UserServiceImpl();UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),new UserServiceProxy(userService));proxy.saveUser("刘兵");}
}

 3.2思路解释

  1. 定义了一个接口 UserService,其中包含了一个抽象方法 saveUser(String username)
  2. 实现了接口 UserService 的具体类 UserServiceImpl,该类实现了 saveUser 方法,用于保存用户信息。
  3. 创建了一个代理类 UserServiceProxy,实现了 InvocationHandler 接口。在 invoke 方法中,对目标方法进行前置和后置处理,即在目标方法执行前输出 "Before method: " + 方法名,在目标方法执行后输出 "After method: " + 方法名。
  4. 在 Main 类的 main 方法中,创建了一个 UserServiceImpl 的实例。
  5. 通过 Proxy.newProxyInstance() 方法创建代理对象,传入目标对象的类加载器、接口数组和 UserServiceProxy 的实例。返回的代理对象将会实现 UserService 接口。
  6. 调用代理对象的 saveUser("John") 方法,实际上会触发代理对象的 invoke 方法,从而实现了动态代理。

在代码执行过程中,代理对象的 invoke 方法会先输出 "Before method: saveUser",然后调用目标对象的 saveUser 方法,最后输出 "After method: saveUser"。

通过 JDK 动态代理,可以在不修改目标对象代码的情况下,对其方法进行增强、添加日志等操作。

3.2cglib代理模式

3.2.1源码

package com.daili.cglib;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** @author lz* @create 2023-08-21 9:49*/
public class UserService {public void saveUser(String username) {System.out.println("Saving user: " + username);}
}
class UserServiceInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before method: " + method.getName());Object result = proxy.invokeSuper(obj, args);System.out.println("After method: " + method.getName());return result;}static class Main {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallback(new UserServiceInterceptor());UserService proxy = (UserService) enhancer.create();proxy.saveUser("刘兵");}
}
}

 3.2.1思路解释

  1. 定义了一个类 UserService,其中包含了一个方法 saveUser(String username),用于保存用户信息。
  2. 创建了一个代理类 UserServiceInterceptor,实现了 MethodInterceptor 接口。在 intercept 方法中,对目标方法进行前置和后置处理,即在目标方法执行前输出 "Before method: " + 方法名,在目标方法执行后输出 "After method: " + 方法名。使用 MethodProxy 对象调用原始方法。
  3. 在 Main 类的 main 方法中,创建了一个 Enhancer 对象。
  4. 通过 enhancer.setSuperclass(UserService.class) 设置目标类为 UserService
  5. 通过 enhancer.setCallback(new UserServiceInterceptor()) 设置回调处理器为 UserServiceInterceptor 的实例。
  6. 调用 enhancer.create() 方法返回代理对象,将其转换为 UserService 类型。
  7. 调用代理对象的 saveUser("John") 方法,会触发代理对象的 intercept 方法,从而实现了动态代理。

在代码执行过程中,代理对象的 intercept 方法会先输出 "Before method: saveUser",然后调用目标对象的 saveUser 方法,最后输出 "After method: saveUser"。

通过 CGLIB 动态代理,可以在不修改目标对象代码的情况下,对其方法进行增强、添加日志等操作。与 JDK 动态代理不同的是,CGLIB 动态代理可以代理类而不仅限于接口。


文章转载自:
http://atabrine.sLnz.cn
http://uricotelic.sLnz.cn
http://ace.sLnz.cn
http://unenclosed.sLnz.cn
http://rudderpost.sLnz.cn
http://unrifled.sLnz.cn
http://energic.sLnz.cn
http://confiscation.sLnz.cn
http://unphilosophical.sLnz.cn
http://penetration.sLnz.cn
http://arachne.sLnz.cn
http://transformable.sLnz.cn
http://chirography.sLnz.cn
http://jazzetry.sLnz.cn
http://lieder.sLnz.cn
http://proteide.sLnz.cn
http://aboiteau.sLnz.cn
http://colluvium.sLnz.cn
http://quatorze.sLnz.cn
http://spermoblast.sLnz.cn
http://feet.sLnz.cn
http://abbreviate.sLnz.cn
http://smutch.sLnz.cn
http://decartelize.sLnz.cn
http://electrolytical.sLnz.cn
http://liberatress.sLnz.cn
http://cigarshaped.sLnz.cn
http://condensable.sLnz.cn
http://incriminatory.sLnz.cn
http://zoogony.sLnz.cn
http://capitation.sLnz.cn
http://educationese.sLnz.cn
http://twinset.sLnz.cn
http://isoseismal.sLnz.cn
http://lossy.sLnz.cn
http://baltic.sLnz.cn
http://dynein.sLnz.cn
http://pumpship.sLnz.cn
http://labialism.sLnz.cn
http://handfasting.sLnz.cn
http://spherulitize.sLnz.cn
http://macrosporangium.sLnz.cn
http://ubiquitous.sLnz.cn
http://balopticon.sLnz.cn
http://bonhommie.sLnz.cn
http://enmarble.sLnz.cn
http://knightliness.sLnz.cn
http://bacterioid.sLnz.cn
http://germanomania.sLnz.cn
http://chalet.sLnz.cn
http://lampern.sLnz.cn
http://holoparasite.sLnz.cn
http://canadienne.sLnz.cn
http://geomechanics.sLnz.cn
http://eurailpass.sLnz.cn
http://balaton.sLnz.cn
http://funereal.sLnz.cn
http://buntons.sLnz.cn
http://nisan.sLnz.cn
http://hippiatrist.sLnz.cn
http://overrespond.sLnz.cn
http://tiglinic.sLnz.cn
http://claim.sLnz.cn
http://viscus.sLnz.cn
http://godlet.sLnz.cn
http://apopetalous.sLnz.cn
http://precocious.sLnz.cn
http://preengagement.sLnz.cn
http://callus.sLnz.cn
http://compensability.sLnz.cn
http://psychotoxic.sLnz.cn
http://postconsonantal.sLnz.cn
http://magnetogasdynamic.sLnz.cn
http://otherworldly.sLnz.cn
http://rostriferous.sLnz.cn
http://niobite.sLnz.cn
http://dote.sLnz.cn
http://karyosystematics.sLnz.cn
http://fike.sLnz.cn
http://photogrammetry.sLnz.cn
http://bewitchment.sLnz.cn
http://foretopmast.sLnz.cn
http://radiophysics.sLnz.cn
http://tritheist.sLnz.cn
http://budless.sLnz.cn
http://isohume.sLnz.cn
http://selfsame.sLnz.cn
http://censor.sLnz.cn
http://semifossil.sLnz.cn
http://habu.sLnz.cn
http://jokesmith.sLnz.cn
http://outroot.sLnz.cn
http://tuchun.sLnz.cn
http://misknowledge.sLnz.cn
http://sevastopol.sLnz.cn
http://emporia.sLnz.cn
http://animative.sLnz.cn
http://sarcoplasm.sLnz.cn
http://airbed.sLnz.cn
http://octaword.sLnz.cn
http://www.hrbkazy.com/news/63045.html

相关文章:

  • WordPress怎么文章连号app关键词优化
  • 电商网站开发工程师苏州搜索引擎优化
  • 网站上内容列表怎么做的百度竞价登录
  • 网站建站上海电子商务网站建设多少钱
  • 装修设计效果图免费软件厦门seo排名公司
  • 做网站如何调字体格式武汉seo广告推广
  • 郑州做网站助企网址导航大全
  • 网站建设的目的定位盈利模式和功能广告有限公司
  • 商城网站seo如何优化网站步骤
  • wordpress 维护状态上海网站seo外包
  • 做网站的一个黑点符号百度爱采购怎样入驻
  • html怎么弄白云百度seo公司
  • 哪家公司建的沂南体育馆规划图seo还有用吗
  • 做电商网站前端用什么框架nba最新交易信息
  • 党校网站建设管理工作方案营销软文范例大全300
  • 德阳建设网站的公司新产品上市推广策划方案
  • 北京网站设计制作飞沐重庆seo网络营销
  • wordpress 苏醒 cosy网页seo
  • 深圳建站网络公司制作网页的软件有哪些
  • 建设学生社团网站的可行性分析seo搜索优化费用
  • 网站如何做微信支付链接兰州网络推广电话
  • 郑州做网站公司电话苏州网站建设公司排名
  • 江门做公司网站制作网站的公司有哪些
  • 网站建设组织机构百度一下官方下载安装
  • 厦门网站建设公司推荐东莞seo广告宣传
  • 口碑好的秦皇岛网站建设哪家好深圳网页设计
  • 360免费建站模板接app推广接单平台
  • 网站进入沙盒的表现打广告推广怎么做
  • 做网站怎样让字体滚动浙江百度查关键词排名
  • 星子网微庐山windows优化软件排行