一、Bean的安全问题
spring中单例bean的线程是否安全
这取决于Bean的内部状态,就是看bean有没有可以改变的成员变量,如果有可以改变的成员变量,那么在并发的情况下就可能会改变成员变量,这样线程就不安全,而如果没有的话就不会发生,所有就是线程安全的。
如果bean会有线程安全的问题,那么可以在类的加@Scope("prototype")注解,
这样每次请求都会创建一个新的Bean实例,从而避免线程安全问题。
二、AOP(面向切面编程)
抽取那些与业务不太相关或者是通用的,要在多个模块里使用到的通用功能的代码(抽取的这些代码叫做通知),再根据需要统一或者单独地向目标方法里添加抽取的这些功能。(比如记录操作日志,更新数据库里的修改时间,事务的实现(方法执行前开启事务,执行完根据情况看是否回滚))
AOP中的相关的名称
三、Bean的生命周期
Spring 容器在进行实例化时会将 XML 配置中的 <bean>
信息封装成一个 BeanDefinition
对象。这个对象包含多个属性来描述 Bean。具体内容如下:
BeanDefinition 相关信息
- beanClassName: Bean 的类名。
- initMethodName: 初始化方法名称。
- propertyValues: Bean 的属性值。
- scope: Bean 的作用域。
- lazyInit: 是否延迟初始化。
BeanDefinition 中的方法
getBeanClassName()
getInitMethodName()
getPropertyValues()
getScope()
-
实例化(Instantiation):Spring容器通过构造函数创建Bean的实例。
-
填充属性(Populate Properties):Spring容器根据配置或注解,将依赖注入到Bean中。这包括通过setter方法或字段注入依赖。
-
实现Aware接口
-
BeanNameAware:如果Bean实现了
BeanNameAware
接口,Spring会调用setBeanName
方法,将Bean的名称传递给它。 -
BeanFactoryAware:如果Bean实现了
BeanFactoryAware
接口,Spring会调用setBeanFactory
方法,将BeanFactory实例传递给它。 -
ApplicationContextAware:如果Bean实现了
ApplicationContextAware
接口,Spring会调用setApplicationContext
方法,将ApplicationContext实例传递给它。
-
-
BeanPostProcessor#before:在Bean初始化之前,任何实现了
BeanPostProcessor
接口的类都会调用postProcessBeforeInitialization
方法。 -
初始化(Initialization):</