- 1. @autowired与@resource的区别
- 2. 单例模式
- 3 new 对象
@autowired
首先尝试通过类型注入,然后通过名字注入
当有多个子实现类时:
- 可以改为注入类型的名字
- 或者通过@qulifier指定名称
- 或者在其中一个实现类使用@primary (优先使用
2. 单例模式@resource
首先通过名字进行注入,然后通过类型注入
当有多个子实现类:
可以改为注入类型的名字
恶汉式:不存在线程安全问题
直接实例化恶汉式
枚举类
静态代码块 需要初始化数据(通常私有参数使用静态块 ,加载配置文件注入)
3 new 对象懒汉式
线程安全版:使用synchronized块保证线程安全,在块的上一层加上对象非空判断,以提高性能。同时使用volatile保证原子性
静态内部类:把实例化静态对象的操作放到静态内部类中;在外部提供公有静态方法。因为静态内部类只有被用到的时候才会被初始化
两个过程:
- 类的初始化过程clinit()
- 一个类创建实例需要先加载并初始化该类(main方法所在的类需要首先被加载和初始化)
- 一个字累被初始化需要先初始化父类
- 一个类被初始化就是执行clinit()方法
clinit方法组成:由静态变量显示赋值代码 和 静态代码块组成
静态变量显示赋值代码 和 静态代码块 按顺序自上而下执行
clinit方法 只执行一次
先执行父类clinit(),再执行字类clinit()
- 类的实例化过程init()
- init()方法可以重载,有几个构造器就有几个init()
- init()方法由 非静态实例显示赋值 、 非静态代码块、构造器代码块组成
- 非静态实例显示赋值 、 非静态代码块 自上而下执行,构造器代码块最后执行
- 每次实例化对象,调用构造器,就是调用init方法
- init方法首先是super()或者super(参数),即对应父类的init()
- 方法的重载
父类方法被重写,子类初始化
父类调用该方法,是调用重写的(因为子类初始化,是当前对象调用的,子类所有的非静态方法和父类非private、非静态的,非final修饰的方法都加了this)
哪些方法不能被重写: static,final,private



