本文涉及点:
Before
Initialization(Object obj, String s)方法做一些自定义的预处理, 它是在我们这个Bean 实例化、依赖注入后,初始化前调用,这点非常重要,Spring 的 AOP 就是利用它实现的。init-method属性
会自动调用其配置的初始化方法。After
Initialization(Object obj, String s)方法,它是在我们这个Bean 实例化、依赖注入、初始化都完成后调用。
注:以上工作完成以后就可以应用这个Bean了。DisposableBean
这个接口,会调用它实现的destroy()方法销毁;如果这个Bean的Spring配置中配置了destroy-method
属性,那么会调用其配置的销毁方法销毁bean。关于上面系列的XXXAware,我的理解是Aware:意识到的,Aware本身是一个空接口,没有任何方法,我觉得他其实相当于一个标识,因为我们很多Bean可能不可避免的要用到spring的一些资源,但是不可能所有的bean都需要一样的信息,那么spring提供了xxx资源很多xxxAware,我们特定的bean需要啥xxx资源就实现这个aware,spring在设置这个bean的时候就把这个资源给设置进去了。
比如说:如果这个Bean已经实现了ApplicationContextAware接口,spring容器就会调用我们的bean的setApplicationContext(ApplicationContext)方法,传入Spring上下文,把spring容器给传递给这个bean。
看情况吧,比如说,我们bean里面写了一些可变成员变量,然后可以进行修改和添加,那并发下肯定会有并发问题的呀;
一般情况下,我们常用的 Controller
、Service
、Dao
这些 Bean 是无状态的。无状态的 Bean 不能保存数据,因此是线程安全的。
对于一定要有数据变更操作的,常见的有 2 种解决办法:
ThreadLocal
成员变量,将需要的可变成员变量保存在 ThreadLocal
中(推荐的一种方式)。prototype
:每次请求都会创建一个新的 bean 实例,自然不会存在线程安全问题。