`

NPE联想到的spring bean的生命周期

 
阅读更多

 

    场景:

      怎么会想到这个题目的呢,最近开发中遇到了一个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)
└─────┘

 

 

 

 

 

0
0
分享到:
评论
2 楼 labreeze 2017-02-14  
szq80140 写道
@PostConstruct 也可以

试了下果然可以,也能获取到注入的bean,学习了。
1 楼 szq80140 2017-02-14  
@PostConstruct 也可以

相关推荐

    npe.m.rar_Matlab代码_npe_npe.m

    亲测可以正常运行的邻域保持嵌入算法NPE的程序,欢迎大家下载。

    NPE.rar_NPE人脸识别_人脸 数据集_流型_流型人脸识别_流型识别

    NPE通过学习一个映射函数,将高维的人脸图像数据映射到一个低维空间,同时保证了原始数据的邻域关系尽可能不变,从而有效地揭示出隐藏在高维数据下的流型结构。 在NPE算法中,"constructM.m"和"NPE.m"是两个关键的...

    NPE.rar_MATLAB实现NPE_NPE matlab_npe

    标题中的"NPE.rar"指的是一个使用MATLAB编程语言实现的NPE(Non-Photorealistic Rendering,非真实感渲染)的代码压缩包。NPE是一种计算机图形学技术,它允许艺术家和开发者创建出具有绘画风格或者模拟特定艺术媒介...

    ISOPAM LLE,NPE等降维算法

    NPE的关键在于使用核函数,如高斯核或多项式核,将数据从原始空间映射到一个高维特征空间,在这个特征空间中,数据可能变得线性可分。然后,NPE寻找一个低维子空间,使得在该子空间中,数据的投影尽可能地保持原有的...

    TonPE_XP_V1.9.4通用PE

    TonPE_XP_V1.9.4通用PE

    npe.rar_npe

    标题中的“npe.rar_npe”可能是指与NPE(Network Processing Element)相关的RAR压缩文件,这通常在处理网络数据流或协议解析时使用。NPE是某些硬件平台中的一个组件,负责处理网络相关的计算任务,提高系统效率。在...

    NPE.rar_npe

    **NPE:邻域保持嵌入** NPE(Neighborhood Preserving Embedding,邻域保持嵌入)是一种非线性降维技术,主要用于高维数据的可视化和分析。该方法旨在保留原始数据集中的局部结构,使在低维空间中的数据点依然能够...

    NPE_npe_dataembedding_

    NPE的核心思想是将高维数据映射到低维空间,同时尽可能地保持原始数据点之间的相对距离关系,以保留其原有的局部结构。这种方法对于可视化、数据挖掘以及模式识别等任务尤其有用。 NPE的基本原理是基于一个假设:在...

    锐捷NPE50系列网络出口引擎

    锐捷NPE50系列网络出口引擎的介绍

    最新PE工具(TonPE)v3.3 --教你如何制作.

    系统维护工具 最新PE工具(TonPE)v3.3 --教你如何制作.doc

    诺顿神奇NPE

    诺顿神奇NPE,在别的杀软查不出毒的时候试试他把

    电脑防护软件npe

    功能强大,不被这个软件认同的,御卸。按需下载,

    U盘工具TonPE_1.9

    winPE制作工具,简单操作,打开之后第一步:选择U盘,第二步:选上两个复选框,下一步。第三步:弹出对话框,点击...开机可以选则从U盘启动。一般联想电脑是F12 ,HP电脑是F9,有些是F2的。有些需要按ESC然后才能选。

    论文研究-相关NPE算法的人脸识别研究.pdf

    传统的近邻保持嵌入(NPE)算法采用欧氏距离作为近邻点选取的度量,但欧氏距离只表示两点间的直线距离,在高维空间中不一定能反映数据间的真实空间分布,易导致近邻选取不准确。针对此问题,提出了相关近邻NPE(CNPE...

    基于NPE改进算法的人脸识别.pdf

    邻域保持嵌入(Neighborhood Preserving Embedding, NPE)是一种非线性降维方法,旨在保留数据集的局部结构。NPE通过寻找低维空间中的映射,使得高维数据的邻域关系在低维空间中尽可能保持不变。然而,NPE算法存在两...

    RG-NPE50系列路由器RGNOS10.3版本命令手册

    RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册RG-NPE50系列路由器RGNOS10.3版本命令手册

    间谍木马清理工具NPE.exe

    病毒木马专清

    springframework.5.0.12.RELEASE

    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系统启动

    【标题】"TonPE XP PE系统启动" 是一个专门针对Windows XP操作系统的可启动便携式环境(PE)工具,它允许用户在不依赖现有操作系统的情况下进行系统维护、修复或重装。这种工具通常用于电脑遇到问题无法正常启动时,...

Global site tag (gtag.js) - Google Analytics