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

网站开发职业总结深圳网络安全公司排名

网站开发职业总结,深圳网络安全公司排名,价格低性价比高的汽车,wordpress 一键转载大家都知道#xff0c;AOP 底层是动态代理#xff0c;而 Java 中的动态代理有两种实现方式#xff1a; 基于 JDK 的动态代理 基于 Cglib 的动态代理 这两者最大的区别在于基于 JDK 的动态代理需要被代理的对象有接口#xff0c;而基于 Cglib 的动态代理并不需要被代理对…大家都知道AOP 底层是动态代理而 Java 中的动态代理有两种实现方式 基于 JDK 的动态代理 基于 Cglib 的动态代理 这两者最大的区别在于基于 JDK 的动态代理需要被代理的对象有接口而基于 Cglib 的动态代理并不需要被代理对象有接口。 那么Spring 中的 AOP 是怎么实现的是基于 JDK 的动态代理还是基于 Cglib 的动态代理 1. Spring 先来说结论Spring 中的动态代理具体用哪种分情况 如果代理对象有接口就用 JDK 动态代理否则就是 Cglib 动态代理。 如果代理对象没有接口那么就直接是 Cglib 动态代理。 来看看这段来自官方文档的说辞 可以看到即使在最新版的 Spring 中依然是如上策略不变。即能用 JDK 做动态代理就用 JDK不能用 JDK 做动态代理就用 Cglib即首选 JDK 做动态代理。 2. Spring Boot  Spring Boot 和 Spring 一脉相承那么在动态代理这个问题上是否也是相同的策略呢抱歉这个还真不一样。 Spring Boot 中对这个问题的处理以 Spring Boot2.0 为节点前后不一样。 在 Spring Boot2.0 之前关于 Aop 的自动化配置代码是这样的Spring Boot 1.5.22.RELEASE Configuration ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class }) ConditionalOnProperty(prefix spring.aop, name auto, havingValue true, matchIfMissing true) public class AopAutoConfiguration {ConfigurationEnableAspectJAutoProxy(proxyTargetClass false)ConditionalOnProperty(prefix spring.aop, name proxy-target-class, havingValue false,matchIfMissing true)public static class JdkDynamicAutoProxyConfiguration {}ConfigurationEnableAspectJAutoProxy(proxyTargetClass true)ConditionalOnProperty(prefix spring.aop, name proxy-target-class, havingValue true,matchIfMissing false)public static class CglibAutoProxyConfiguration {}} 可以看到这个自动化配置主要是在讨论 application.properties 配置文件中的 spring.aop.proxy-target-class 属性的值。 具体起作用的是 ConditionalOnProperty 注解关于这个注解中的几个属性也来稍微说下 prefix配置文件的前缀。 name配置文件的名字和 prefix 共同组成配置的 key。 having期待配置的值如果实际的配置和 having 的值相同则这个配置就会生效否则不生效。 matchIfMissing如果开发者没有在 application.properties 中进行配置那么这个配置类是否生效。 基于如上介绍很容易看出 如果开发者设置了 spring.aop.proxy-target-class 为 false则使用 JDK 代理。 如果开发者设置了 spring.aop.proxy-target-class 为 true则使用 Cglib 代理。 如果开发者一开始就没配置 spring.aop.proxy-target-class 属性则使用 JDK 代理。 这是 Spring Boot 2.0 之前的情况。 再来看看 Spring Boot 2.0含之后的情况Spring Boot 2.0.0.RELEASE Configuration ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class,AnnotatedElement.class }) ConditionalOnProperty(prefix spring.aop, name auto, havingValue true, matchIfMissing true) public class AopAutoConfiguration {ConfigurationEnableAspectJAutoProxy(proxyTargetClass false)ConditionalOnProperty(prefix spring.aop, name proxy-target-class, havingValue false, matchIfMissing false)public static class JdkDynamicAutoProxyConfiguration {}ConfigurationEnableAspectJAutoProxy(proxyTargetClass true)ConditionalOnProperty(prefix spring.aop, name proxy-target-class, havingValue true, matchIfMissing true)public static class CglibAutoProxyConfiguration {}} 可以看到大部分配置都是一样的有一个地方不太相同那就是 matchIfMissing 属性的值。可以看到从 Spring Boot2.0 开始如果用户什么都没有配置那么默认情况下使用的是 Cglib 代理。 3. 实践 最后可以写一个简单的例子验证一下上面的理论。 首先创建一个 Spring Boot 项目本案例使用最新版 Spring Boot即默认使用 Cglib 代理加入三个依赖即可如下 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId /dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId /dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId /dependency 接下来创建一个 IUserService 接口如下 public interface IUserService {void hello();} 然后再来创建一个该接口的实现类 Service public class UserServiceImpl implements IUserService {Overridepublic void hello() {}} 方法不用实现。 再来一个简单的切面 Aspect Component EnableAspectJAutoProxy public class LogAspect {Before(execution(* org.lzx.demo.UserServiceImpl.*(..)))public void before(JoinPoint jp) {System.out.println(jp.getSignature().getName() jp.getSignature().getName());}} 最后再来一个简单的测试方法注入 IUserService 实例 RestController public class HelloController {Autowiredprivate IUserService iUserService;GetMapping(/hello)public void hello() {iUserService.hello();}} DBUEG 运行一下就可以看到 IUserService 是通过 Cglib 来代理的。 如果我们想用 JDK 来代理那么只需要在 application.properties 中添加如下配置即可 spring.aop.proxy-target-classfalse 添加完成后重新 DEBUG如下图 可以看到已经使用了 JDK 动态代理了。 如果用的是 Spring Boot 1.5.22.RELEASE 这个版本那么即使不在 application.properties 中添加配置默认也是 JDK 代理。  4. 小结 总结一下 Spring 中的 AOP有接口就用 JDK 动态代理没有接口就用 Cglib 动态代理。 Spring Boot 中的 AOP2.0 之前和 Spring 一样2.0 之后首选 Cglib 动态代理如果用户想要使用 JDK 动态代理需要自己手动配置。
http://www.w-s-a.com/news/48744/

相关文章:

  • 外贸网站建设 深圳seo怎么提升关键词的排名
  • 网站推广效果的评价google关键词
  • 模板网站建站哪家好做微信充值网站
  • 抽奖的网站怎么做的广州小程序定制开发
  • 网站的文件夹建设企业网站公积金
  • 做网站的的价位网站建设 考试题目
  • 深圳比邻网站建设北京优化服务
  • 菏泽网站建设哪家好电子商务网络安全
  • 仿一个网站广州网站建设正规公司
  • 网站建设 目的seo网站关键词排名快速
  • 什么叫做响应式网站自媒体全平台发布
  • 企业网站 案例哪里需要人做钓鱼网站
  • 厚街东莞网站建设网站开发者调试模式
  • 网站推广营销联系方式wordpress adminlte
  • 哪些网站可以做文字链广告卖水果网站建设的策划书
  • 雕刻业务网站怎么做企业qq官网
  • 新华书店的做的数字阅读网站wordpress编辑器格式
  • jq做6个网站做什么好广西临桂建设局网站
  • 网站新闻图片尺寸南京网站设计公司
  • 重庆seo建站网站服务器 安全
  • 咸宁做网站的公司桂林网站建设兼职
  • 教做网站网站开发行业分析
  • 忻州网站建设培训友情链接交换形式有哪些
  • 佛山做外贸网站渠道外贸常用网站
  • 文章收录网站网站及新媒体建设办法
  • 招聘网站排行榜2021找建网站公司
  • 网站建设制作宝塔面板活动宣传推广的形式有哪些
  • 掉关键词网站敏捷软件开发流程
  • 微信小程序格泰网站建设新闻采编与制作专业简历
  • 电子商城建设网站海伦网站建设