上海网站建设的公司宁波发布最新通报

bicheng/2026/1/18 0:33:26/文章来源:
上海网站建设的公司,宁波发布最新通报,江苏做网站怎么收费多少,有限责任公司公司章程范本简介 Lookup注解可能平时开发中大家接触的少#xff0c;但是又确实挺有用的#xff0c;比如我们一个单例Bean注入了一个原型Bean#xff0c;原型Bean的效果其实是会失效的#xff0c;因为单例Bean一开始就实例化好了#xff0c;后面也不会再变化#xff0c;但我们可能需…简介 Lookup注解可能平时开发中大家接触的少但是又确实挺有用的比如我们一个单例Bean注入了一个原型Bean原型Bean的效果其实是会失效的因为单例Bean一开始就实例化好了后面也不会再变化但我们可能需要的就是原型Bean呀那么怎么解决呢如果注入的是一个动态的就好了于是我们马上就会想到代理对象spring中Lookup就可以帮助我们实现该效果原理就是生成了一个代理对象 Lookup还有一个功能就是可以放在抽象类上如果一个类是一个抽象类一般是不能生成Bean对象的但是里面有方法加了Lookup就可以 Lookup放在抽象类上 Component(abstractLookup) public abstract class AbstractLookup {// Lookuppublic abstract void test(); }public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext();context.scan(com.shura.lookup);context.refresh();System.out.println(context.getBean(abstractLookup)); }启动报错Exception in thread main org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named abstractLookup available 以上定义了一个抽象类加了Component注解通过扫描注册Bean但是报错了报错原因是spring并没有这么一个Bean 我们修改一下在test方法上面加上一个Lookup注解 再次运行 输出 com.shura.lookup.AbstractLookup$$EnhancerBySpringCGLIB$$fb5a491025618e91从输出的结果可以看出其实也是一个CGLIB的代理对象 如何判断的 在扫描出Bean生成BeanDefinition之前会做判断代码如下 ClassPathScanningCandidateComponentProvider#isCandidateComponent protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {AnnotationMetadata metadata beanDefinition.getMetadata();/*** 是否是独立的类普通的类静态的匿名内部类是独立的类匿名内部类不是独立的类* 接口或者抽象类不能作为Bean* 但是如果是抽象类却有Lookup注解也是是一个Bean*/return (metadata.isIndependent() (metadata.isConcrete() ||(metadata.isAbstract() metadata.hasAnnotatedMethods(Lookup.class.getName())))); }注入原型Bean 上面讲到了单例Bean注入原型Bean是没有原型Bean的效果的代码如下 Component(ConfigurableBeanFactory.SCOPE_SINGLETON) public class A {Autowiredprivate B b;public void test() {System.out.println(b);} }Component Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) class B {} 启动类 public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext();context.scan(com.shura.lookup);context.refresh();A a context.getBean(A.class);a.test();a.test(); }执行 com.shura.lookup.B2aafb23c com.shura.lookup.B2aafb23c从上面结果看出确实没有原型的效果 修改为Lookup注解方式 Component(ConfigurableBeanFactory.SCOPE_SINGLETON) public class A {public void test() {System.out.println(b());}Lookuppublic B b() {return null;} }再次执行启动类 com.shura.lookup.B17d99928 com.shura.lookup.B3834d63f从结果来看大家也了解了其作用。 源码解析 效果有了就来看下源码如何做到的Lookup解析的源码在 AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors 中这个方法每个Bean实例化都会执行这个类的详细介绍将在下一篇文章介绍本文先介绍其中Lookup部分 if (!this.lookupMethodsChecked.contains(beanName)) {// 这步判断没什么用忽略if (AnnotationUtils.isCandidateClass(beanClass, Lookup.class)) {try {Class? targetClass beanClass; // beanClass传入进来的do {// 遍历targetClass中的method查看是否写了Lookup方法ReflectionUtils.doWithLocalMethods(targetClass, method - {Lookup lookup method.getAnnotation(Lookup.class);if (lookup ! null) {Assert.state(this.beanFactory ! null, No BeanFactory available);// 将当前method封装成LookupOverride// lookup.value()表示设置的beanNameLookupOverride override new LookupOverride(method, lookup.value());RootBeanDefinition mbd (RootBeanDefinition) this.beanFactory.getMergedBeanDefinition(beanName);// 设置到BeanDefinition的methodOverrides中mbd.getMethodOverrides().addOverride(override);}});// 父类有lookup也检查一下targetClass targetClass.getSuperclass();}while (targetClass ! null targetClass ! Object.class);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName, Lookup method resolution failed, ex);}}// 表示该类已经检查过了lookup下次就不用检查了this.lookupMethodsChecked.add(beanName); }lookup找出来之后就看实例化是怎么处理的了 下面是实例化的源码逻辑 SimpleInstantiationStrategy#instantiate public Object instantiate(RootBeanDefinition bd, Nullable String beanName, BeanFactory owner) {// 判断BeanDefinition是否存在Lookup的方法if (!bd.hasMethodOverrides()) {// 没有LookupConstructor? constructorToUse;synchronized (bd.constructorArgumentLock) {constructorToUse (Constructor?) bd.resolvedConstructorOrFactoryMethod;if (constructorToUse null) {final Class? clazz bd.getBeanClass();constructorToUse clazz.getDeclaredConstructor();// 保存bd.resolvedConstructorOrFactoryMethod constructorToUse;}}// 通过 Constructor#newInstance构造出来return BeanUtils.instantiateClass(constructorToUse);}else {// 如果存在Lookup生成一个代理对象return instantiateWithMethodInjection(bd, beanName, owner);} }上面看出如果是有Lookup注解生成的是一个代理对象那么代理对象里面又是怎么处理的CglibSubclassingInstantiationStrategy.LookupOverrideMethodInterceptor#intercept public Object intercept(Object obj, Method method, Object[] args, MethodProxy mp) throws Throwable {LookupOverride lo (LookupOverride) getBeanDefinition().getMethodOverrides().getOverride(method);Object[] argsToUse (args.length 0 ? args : null); // if no-arg, dont insist on args at allif (StringUtils.hasText(lo.getBeanName())) {// owner就是BeanFactoryObject bean (argsToUse ! null ? this.owner.getBean(lo.getBeanName(), argsToUse) :this.owner.getBean(lo.getBeanName()));return (bean.equals(null) ? null : bean);}else {ResolvableType genericReturnType ResolvableType.forMethodReturnType(method);return (argsToUse ! null ? this.owner.getBeanProvider(genericReturnType).getObject(argsToUse) :this.owner.getBeanProvider(genericReturnType).getObject());} }主要看关键逻辑是通过BeanFactory.getBean()获取的原型Bean那么自然每次的Bean对象都是不一样的 总结 以上就是Lookup注解的源码分析了下一篇介绍推断构造方法扩展点 欢迎关注学习不迷路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社交网站备案爱站工具包

网络安全对于游戏行业来说是至关重要的,当游戏行业受到恶意的攻击者进行网络攻击时,严重的会导致服务器崩溃,使业务无法正常进行工作运行,给企业造成巨大的经济损失,那么对于网络安全,游戏服务器需要注意哪…

wordpress整站数据广东建设工程信息网站

在独立站跨境贸易当中,很多时候我们都会重复一个动作,那就是查看对手网站或者某一网站的流量,以此来分析和总结如何优化自己的站点,借鉴对手优秀的地方来补足自己的缺点,或者某些时候会模仿甚至抄袭竞品网站。那么如何…

网站建设方案和报价表软件开发人天报价标准

文章目录 1 Hive概述2 Hive部署2.1 规划2.2 安装软件 3 Hive体验4 Hive客户端4.1 HiveServer2 服务4.2 DataGrip 5 问题集5.1 Could not open client transport with JDBC Uri 结语 1 Hive概述 Apache Hive是一个开源的数据仓库查询和分析工具,最初由Facebook开发&…

外贸设计网站建设网站建设创新成果

原创 | 文 BFT机器人 01 人机交互的新工具 在人机交互领域,来自欧洲各地的研究人员开发了一种名为HEUROBOX的新工具,用于评估交互。HEUROBOX提供了84个基本启发式和228个高级启发式,用于评估人机交互的各个方面,如安全性、人体工…

加强普法网站和普法网络集群建设关于建设工程资质网站

“更适合中国宝宝体质”的主题乐园,被泡泡玛特造出来了。 9月26日,位于北京朝阳公园内的国内首个潮玩行业沉浸式 IP 主题乐园,也是泡泡玛特首个线下乐园——泡泡玛特城市乐园 POP LAND正式开园。 约4万平方米的空间中,泡泡玛特使…

杭州网站建设优化推广网络推广学校

转载自:http://blog.sina.com.cn/s/blog_7571423b01016707.html 编程求解:输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,使其和等于 m , 要求将其中所有的可能组合列出来. 分析: 主要思…

手机网站微信支付代码陕西西安网站设计公司

在现代办公场景中,数据可视化的应用已经成为提高效率、推动创新的得力工具。无论是管理层还是普通员工,都能从数据可视化中受益匪浅。下面我就以可视化从业者的角度,简单聊聊这个话题。 首先,数据可视化提升了数据的易读性与理解性…

大学生做网站和做app深圳市住房和城乡建设部网站

VSS概述版本控制是工作组软件开发中的重要方面,它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时,源代码的控制是非常有用的。Visual SourceSafe 是一种源代…

专业网站的建设设行吗温州网站建设和运营

java lambda循环对于每个经常需要在Java 8&#xff08;或更高版本&#xff09;中使用多维数组的人来说&#xff0c;这只是一个快速技巧。 在这种情况下&#xff0c;您可能经常会以类似于以下代码的结尾&#xff1a; float[][] values ... for (int i 0; i < values.leng…

服装网站 欣赏wordpress 媒体库无法打开

此片文章简单介绍布局管理的使用方法。通过实例先分别介绍分隔窗口QSplitter类、停靠窗口QDockWidget类及QStackedWidget类的使用&#xff0c;最后再通过一个实例介绍QLayout的使用。 分割窗口QSplitter类 分隔窗口可以灵活地布局窗口&#xff0c;可以用在文件资源管理器地窗…

写作网站哪个能得稿费网站编辑岗位

在当今数字化时代&#xff0c;云服务器作为企业级应用的核心设备&#xff0c;其性能和类型对于企业的运营和数据处理至关重要。在常见的香港云服务器类型中&#xff0c;通用型和计算型是最为常见的两种。那么&#xff0c;这两种云服务器到底有什么区别呢? 设计目标和应用场景不…

龙华网站建设招商做版权保护的网站

iPhone 15 是 Apple 最新、最出色的智能手机。它拥有时尚的设计、尖端的技术和众多功能&#xff0c;使其成为市场上最令人垂涎​​的设备之一。不幸的是&#xff0c;与所有智能手机一样&#xff0c;iPhone 14 容易发生可能导致屏幕破裂的事故和事故。破损的屏幕可能是毁灭性的&…

网站安全检测发生告警后邮局网站建设的目的

返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点&#xff0c;它旨在成为一个通用的WEB应用程序框架和项目模板。 ABP的官方网站&#xff1a;http://www.aspnetboilerp…

电影频道做的网站广告广州网站建设公司小程序

1.对象内存图 1.1 Java 内存分配 1.2 堆和栈 栈:所有局部变量都会在栈内存中创建 局部变量&#xff1a;定义在方法中的变量或者方法声明上的变量 方法执行都会加载到栈中进行 -----------------------------------------------------------------------------------------…

怎么做品牌推广网站微信小程序跳转到网页

已知两个链表L1和L2分别表示两个集合&#xff0c;其中元素递增排列。请设计一个算法&#xff0c;用于求出L1与L2的交集&#xff0c;并存放在L1链表中。 代码思路&#xff1a; 我们创建一个辅助链表L3&#xff0c;用于存储L1和L2链表的交集&#xff0c;用s遍历L3各个元素 用p和…

芯片公司网站建设百度seo网站排名

文章目录 任务处理方式异步操作的优缺点async和awiatasyncawait使用 async/await 的注意事项示例 前言&#xff1a;此篇文章是在文心一言的辅助下完成的。 任务处理方式 同步操作&#xff1a;同步操作是指所有的操作都完成后&#xff0c;才返回给用户结果。当一个任务发出请求…

凡科网站怎么修改昨天做的网站c语言做网站吗

LeetCode每日一题 1944.队列中可以看到的人数 1944. 队列中可以看到的人数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heig…

宿州集团网站建设做有关兼职网站的需求分析

顺序 : 从上向下&#xff0c; 顺序执行代码分支 : 根据条件判断&#xff0c; 决定执行代码的分支循环 : 让特定代码重复的执行

做logo有哪些网站负责网站的建设规划

MongoDB 面试题 1. 什么是MongoDB&#xff1f; MongoDB是一种非关系型数据库&#xff0c;被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#xff0c;支持动态查询和索引&#xff0c;也支持BSON格式的数据存储&#xff0c;这…

网站定位方案 资源新版在线天堂

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…