1 bean的作用域
2. singleton和prototype 区别
所谓单例,就是Spring的IOC机制只创建该类的一个实例,每次请求,都会用这同一个实例进行处理,因此若存在全局变量,本次请求的值肯定会影响下一次请求时该变量的值。
原型模式,指的是每次调用时,会重新创建该类的一个实例,比较类似于我们自己自己new的对象实例。需要使用getBean的方式获取,而不能直接使用autowired的方式,因为它的上层调用层是单例的话,使用autowired,调用的方法还是初始化注入的bean,即老bean,并不是再次new的对象实例
注意:改变底层(如service层)的对象为原型时,同时改变上层调用层(如controller层)的调用方式,原型模式才会生效
注意:singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean
由于原型模式,是通过调用容器的getBean来获取的,spring就不能对prorotype bean的整个生命周期负责,需要客户端负责prototype bean的生命周期管理。
3.管理Bean的生命周期行为
主要有两个时机:注入依赖关系后,销毁实例之前;具体的管理方法如下
Spring提供两种方式在Bean全部属性设置成功后执行特定行为
使用init-method 属性(代码污染小)
在类中编写一个方法,在属性中指定该方法在依赖关系设置完成后自动执行。
实现InitializingBean接口(耦合较高)
编写afterPropertiesSet()方法的具体实现
同理,若在Bean销毁之前,执行特定的方法,只需要①使用 destroy-method属性②实现DisposableBean接口(实现destroy()方法)