场景:
怎么会想到这个题目的呢,最近开发中遇到了一个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的程序,欢迎大家下载。
多种流形学习的降维算法,ISOPAM LLE,NPE等降维算法
锐捷NPE50系列网络出口引擎的介绍
程序为matlab代码,LGM是NPE调用的
NPE: Neighborhood Preserving Embedding
TonPE_XP_V1.9.4通用PE
诺顿神奇NPE,在别的杀软查不出毒的时候试试他把
功能强大,不被这个软件认同的,御卸。按需下载,
winPE制作工具,简单操作,打开之后第一步:选择U盘,第二步:选上两个复选框,下一步。第三步:弹出对话框,点击...开机可以选则从U盘启动。一般联想电脑是F12 ,HP电脑是F9,有些是F2的。有些需要按ESC然后才能选。
传统的近邻保持嵌入(NPE)算法采用欧氏距离作为近邻点选取的度量,但欧氏距离只表示两点间的直线距离,在高维空间中不一定能反映数据间的真实空间分布,易导致近邻选取不准确。针对此问题,提出了相关近邻NPE(CNPE...
RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册
系统维护工具 最新PE工具(TonPE)v3.3 --教你如何制作.doc
基于NPE改进算法的人脸识别.pdf
邻域保持嵌入算法(NPE)是一种保持样本空 间中数据点的局部邻域结构信息的子空间特征学习方法。
病毒木马专清
Exporting a lazily initialized bean (which implements SelfNaming and is annotated with ManagedResource annotation) gives IllegalStateException [SPR-17592] #22124 MockHttpServletRequest changes Accept-...
用于流型学习的算法:局部邻域保持 可以分析任何符合流型分布的数据集,常用语人脸识别
OMAP44xx CTRL_MODULE_CORE registers and bitfields.
RG-NPE系列出口网关RGOS 10.3(4b10)版本配置手册(V2.0)
NPE的云台控制软件,可以用电脑控制云台转动