场景:
怎么会想到这个题目的呢,最近开发中遇到了一个NPE问题,后来查下去觉得挺有意思,所以就拿出来分享下。code 如下。
public class Service{ @Resource(name = "xxx") private ConfigService disconf; private loginEventThreadPool = new ThreadPoolExecutor( 2, disconf.getMaxThread(), ThreadPool.THREAD_POOL_WAIT_SECONDS, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2000), new ThreadPoolExecutor.AbortPolicy() ); }
探索一,看这个问题肯定是disconf没有初始化进去了,试试在构造函数里面看看能不能初始化吧,尼玛还是NPE。
public class Service{ @Resource(name = "xxx") private ConfigService disconf; private loginEventThreadPool = null; public Service() { loginEventThreadPool = new ThreadPoolExecutor( 2, 10, ThreadPool.THREAD_POOL_WAIT_SECONDS, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2000), new ThreadPoolExecutor.AbortPolicy() ); } }
探索二,好像有个叫init的方法,但是尼玛要在xml中配置,太麻烦了,我是注解控啊,不喜欢配置。
探索三, 依赖spring的生命周期InitializingBean 在spring bean设置完后才执行方法,搞定。
public class Service{ @Resource(name = "xxx") private ConfigService disconf; private loginEventThreadPool = null; @OverRide public void afterPropertiesSet() throws Exception { loginEventThreadPool = new ThreadPoolExecutor( 2, 10, ThreadPool.THREAD_POOL_WAIT_SECONDS, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2000), new ThreadPoolExecutor.AbortPolicy() ); } }
问题:通过这个问题我可以去了解哪些东西
1. 属性和构造器的执行顺序
2. spring的生命周期
3. 记得以前来面试的时候高老师问过我循环依赖的问题,也是该主题的啊,顺便一起研究下。
结论:
1. 类先设置属性,然后执行构造器的方法 。
对象new 出来后再查询field 为2 ,即使field字段放在构造函数之后也是一样。
public class MyObject { private int fileld = 1; public MyObject() { fileld = 2; } public int getFileld() { return fileld; } }
2. spring的生命周期 参照http://www.cnblogs.com/caoyc/p/5624417.html
从文档中可以看出spring bean属性设置是在构造器执行之后,但是一般属性是在构造器之前。所以执行顺序是一般属性(loginEventThreadPool) --> 构造器 --> spring bean属性。所以也就验证了为啥前两个场景报NPE的错误。
3. 循环依赖,如果构造器不依赖则正常初始化,构造器依赖则初始化失败。
从第二个结论的链接可以看出初始化和设置spring bean是分开的。如果A 构造器不依赖于B,则A B都能实例化,实例化之后也就可以做下面的spring bean属性设置了。
@Component("beanA") public class BeanA{ @Autowired private BeanB beanB; public BeanA(BeanB beanB) { } } @Component public class BeanB { @Autowired private BeanA beanA; } // 报错如下,这图太形象了,NB ┌─────┐ | beanA defined in file [/xxx/classes/com/spring/model/BeanA.class] ↑ ↓ | beanB (field private com.spring.model.BeanA com.spring.model.BeanB.beanA) └─────┘
相关推荐
亲测可以正常运行的邻域保持嵌入算法NPE的程序,欢迎大家下载。
NPE通过学习一个映射函数,将高维的人脸图像数据映射到一个低维空间,同时保证了原始数据的邻域关系尽可能不变,从而有效地揭示出隐藏在高维数据下的流型结构。 在NPE算法中,"constructM.m"和"NPE.m"是两个关键的...
标题中的"NPE.rar"指的是一个使用MATLAB编程语言实现的NPE(Non-Photorealistic Rendering,非真实感渲染)的代码压缩包。NPE是一种计算机图形学技术,它允许艺术家和开发者创建出具有绘画风格或者模拟特定艺术媒介...
NPE的关键在于使用核函数,如高斯核或多项式核,将数据从原始空间映射到一个高维特征空间,在这个特征空间中,数据可能变得线性可分。然后,NPE寻找一个低维子空间,使得在该子空间中,数据的投影尽可能地保持原有的...
TonPE_XP_V1.9.4通用PE
标题中的“npe.rar_npe”可能是指与NPE(Network Processing Element)相关的RAR压缩文件,这通常在处理网络数据流或协议解析时使用。NPE是某些硬件平台中的一个组件,负责处理网络相关的计算任务,提高系统效率。在...
**NPE:邻域保持嵌入** NPE(Neighborhood Preserving Embedding,邻域保持嵌入)是一种非线性降维技术,主要用于高维数据的可视化和分析。该方法旨在保留原始数据集中的局部结构,使在低维空间中的数据点依然能够...
NPE的核心思想是将高维数据映射到低维空间,同时尽可能地保持原始数据点之间的相对距离关系,以保留其原有的局部结构。这种方法对于可视化、数据挖掘以及模式识别等任务尤其有用。 NPE的基本原理是基于一个假设:在...
锐捷NPE50系列网络出口引擎的介绍
系统维护工具 最新PE工具(TonPE)v3.3 --教你如何制作.doc
诺顿神奇NPE,在别的杀软查不出毒的时候试试他把
功能强大,不被这个软件认同的,御卸。按需下载,
winPE制作工具,简单操作,打开之后第一步:选择U盘,第二步:选上两个复选框,下一步。第三步:弹出对话框,点击...开机可以选则从U盘启动。一般联想电脑是F12 ,HP电脑是F9,有些是F2的。有些需要按ESC然后才能选。
传统的近邻保持嵌入(NPE)算法采用欧氏距离作为近邻点选取的度量,但欧氏距离只表示两点间的直线距离,在高维空间中不一定能反映数据间的真实空间分布,易导致近邻选取不准确。针对此问题,提出了相关近邻NPE(CNPE...
邻域保持嵌入(Neighborhood Preserving Embedding, NPE)是一种非线性降维方法,旨在保留数据集的局部结构。NPE通过寻找低维空间中的映射,使得高维数据的邻域关系在低维空间中尽可能保持不变。然而,NPE算法存在两...
RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册
病毒木马专清
Exporting a lazily initialized bean (which implements SelfNaming and is annotated with ManagedResource annotation) gives IllegalStateException [SPR-17592] #22124 MockHttpServletRequest changes Accept-...
【标题】"TonPE XP PE系统启动" 是一个专门针对Windows XP操作系统的可启动便携式环境(PE)工具,它允许用户在不依赖现有操作系统的情况下进行系统维护、修复或重装。这种工具通常用于电脑遇到问题无法正常启动时,...