1. 问题点

最近在写单例模式的时候碰到了@Autiwired注解注入为NULL的情况,研究一番,发现是和类的初始化顺序有关。先抛出我的问题:

//异步处理

public class AsyncManager {

@Autowired

ScheduledExecutorService scheduledExecutorService;

/**

* 操作延迟10毫秒

*/

private final int OPERATE_DELAY_TIME = 10;

/**

* 静态AsyncManager,单例

*/

private static AsyncManager manager = new AsyncManager();

/**

* 无参构造函数

*/

private AsyncManager(){}

/**

* 单例模式(饿汉式)

* @return AsyncManager

*/

public static AsyncManager getManager() {

return manager;

}

public void execute(TimerTask task) {

scheduledExecutorService.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);

}

}

public SysUser login(String username, String password) {

AsyncManager.getManager().execute(new TimerTask() {

@Override

public void run() {

System.out.println(123);

}

});

return null;

}

问题点:

在调用AsyncManager.getManager().execute()的方法时,scheduledExecutorService为NULL,并未引入。

原因:

@Autowired一定要等本类构造完成后,才能从外部引用设置进来。调用AsyncManager.getManager().execute()的方法时,scheduledExecutorService还没有注入进来,这也是为什么@Autowired注解推荐写在构造器或者方法上。

2. 类的初始化顺序

由上面的问题,引申出来类的初始化和初始化顺序问题。

先看测试代码:

public class Dog {

public static int a;

public int b;

static {

System.out.println("Static{} a, " + a++);

}

{

System.out.println("{} a, " + a++);

System.out.println("{} b, " + b++);

}

public Dog() {

System.out.println("Construct a, " + a++);

System.out.println("Construct b, " + b++);

}

public static void show() {

System.out.println("show() a, " + a++);

}

public void display() {

System.out.println("display() a, " + a++);

System.out.println("display() b, " + b++);

}

public static void main(String[] args) {

//Dog.show();

//System.out.println(Dog.a);

new Dog();

}

}

main方法中执行new Dog()时,程序运行结果为:

Static{} a, 0

{} a, 1

{} b, 0

Construct a, 2

Construct b, 1

结果说明初始化顺序为:

Static成员变量 -> Static代码块 -> 普通成员变量 -> 普通代码块 -> 构造函数

如果有继承关系,则顺序为:父类Static成员变量 -> 父类Static代码块 -> 子类Static成员变量 -> 子类Static代码块 -> 父类普通成员变量 -> 父类普通代码块 -> 子类普通成员变量 -> 子类普通代码块 -> 父类构造函数 -> 构造函数

3. 类什么时候初始化

创建类的实例的时候,即new一个对象

访问某个类或接口的静态变量,或者对该静态变量赋值

调用类的静态方法

反射

初始化一个类的子类(会首先初始化子类的父类)

JVM启动时标明的启动类,即文件名和类名相同的那个类

java web 初始化方法_Java Web(二) 类的初始化及初始化顺序相关推荐

  1. 【python】定义一个Lader类 具有为浮点数的上底、下底、高、面积属性,具有返回面积的功能初始化方法对上底、下底、高进行初始化等等

    # Lader类具有类型为浮点数的上底.下底.高.面积属性,具有返回面积的功能,包括一个 # 初始化方法对上底.下底.高进行初始化.Circle类具有类型为浮点型的半径.周长和面积 # 属性,具有返回 ...

  2. java显示html乱码怎么解决方法_Java web解决各种乱码问题

    首先先明白一下Java web里涉及到编码的地方: 1.jsp编码jsp顶部有两处:charset和pageEncoding charset:服务器发往客户端展现时的编码; pageEncoding: ...

  3. java类的初始化方法_JAVA类初始化和实例初始化

    一.类初始化过程 1.一个类要创建实例需要先创建和加载 (1) main方法所在的类需要先加载和实例化 2.一个子类要初始化,需要先初始化父类 3.一个类初始化就是执行方法 (1) () 方法由静态类 ...

  4. java web 监听器 例子_Java web技术应用---监听器

    监听器的定义 (专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时,立即采取相应的行动) 定义:Servlet规范中定义的一种特殊的类,用于监听Servlet ...

  5. java web网上书店_java web简易网上书店项目系列,使用MVC模式(servlet+jstl+dbutils),开篇...

    一. 针对很多java web初学者入门困难的问题,笔者利用一个小型web项目,一步一步的展示java web开发方法,每一个章节引入一些java web开发的重点知识,让同学们可以将java web ...

  6. java web项目测试_java web项目怎么测试?

    慕仰1329654 java web项目测试用Web的测试工具,如HtmlUnit,JWebUnit等.main()方法就可以测试,在main方法中获得connection对象将他输出就可以了.如果正 ...

  7. java web 许令波_Java Web——Web概述

    已经很久没有更新博客了,过年忙着吃喝玩乐,就怠惰了一小下下?幸好这学期新开的课程都比较有趣--Java Web和Android.至少对于我自己来说,既充满挑战,又富有趣味. --[1.Web概述]-- ...

  8. java反射 获取方法_java反射之获取类的信息方法(推荐)

    本文接上文"老生常谈反射之class类的使用(必看篇)",以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获 ...

  9. java的equals方法_Java LocalDateTime类| 带示例的equals()方法

    java的equals方法 LocalDateTime类equals()方法 (LocalDateTime Class equals() method) equals() method is avai ...

最新文章

  1. java产生全局唯一的int类型_全局唯一ID设计
  2. 如何创建一个自动化测试项目
  3. Python程序设计之如何设置统一编码格式
  4. 2020-12-3(详解虚拟地址如何转化为物理地址)
  5. go语言int类型转化成string类型的方式
  6. 年薪40W+还招不到人!人工智能到底有多火?(附人工智能+Python 自学视频资料)...
  7. 网站集成支付宝接口安装教程
  8. Spring mvc Controller接口
  9. php正则表达式提取url,php 正则表达式提取图片url程序
  10. 国科大学习资料--自然语言处理(宗成庆)-2019期末考试题
  11. 广播前置放大器的作用_前置放大器的作用和特点
  12. SPSS调节效应分析插件 v1.1.1
  13. python timepicker_Android DatePicker和TimePicker:时间日期选择器
  14. 武田宣布就拟收购Shire plc签署优先短期贷款工具协议及次级银团贷款协议和过桥信贷协议第二次修订
  15. word恢复默认样式
  16. 中华名将索引 - 第一批:李世民
  17. 多因子风险建模-协方差矩阵、投资组合风险
  18. 马云5年实现“无现金社会”,必须迈过这几道坎?
  19. 立图教育-专业的职业培训机构
  20. DJ12-2 8086 系列指令系统(第三节课)

热门文章

  1. 职场5年经验的工程师论述linux真没那么难
  2. spintboot学习笔记
  3. eclipse安装Log4E插件以及简单使用
  4. 在拓扑图上做标准ACL和扩展ACL(期末考试)
  5. jetspeed 安装及数据库配置
  6. Access里执行SQL
  7. java jar 配置_java jar包与配置文件的写法
  8. 插入排序 链表 java_Java实现 LeetCode 147 对链表进行插入排序
  9. miui 8 android对应关系,小米回应MIUI版本和安卓版本没有对应关系 你怎么看
  10. elementui table html,elementUI Table表格表头自定义