注册一个Bean有哪些方式
@Component
@Configuration
@Service
@Controller
@Repository
@Import
导入类或BeanDefinition作为Bean
@ImportResource
导入一个spring.xml文件,通过解析该文件注册Bean
BeanDefinitionRegistryPostProcessor
通过注册BeanDefinition来注册Bean
FactoryBean
SmartFactoryBean
将自己new的一个对象注册为Bean
applicationContext.registerBean()
通过Supplier接口来提供一个对象作为Bean
applicationContext.register()
直接将某个类注册为Bean
applicationContext.registerBeanDefinition()
注册一个BeanDefinition,就相对于注册了一个Bean
Bean的作用域
Request
request.getAttribute()
request.setAttribute()
Session
session.getAttribute()
session.setAttribute()
application
servletContext.getAttribute()
servletContext.setAttribute()
Bean创建的生命周期
BeanDefinition合并
一个Bean可以有自己的父Bean,那么子Bean就会继承父Bean中所定义的各种属性,比如scope
类加载
在创建一个对象前,得确保对应的类已经加载了
注意:在扫描时,是利用的ASM继续去解析的类,并没有加载类
实例化前
提供了一个扩展点,可以让程序员在这个位置控制某个Bean对象的创建
实例化
Supplier创建对象
工程方法创建对象
推断构造方法
BeanDefinition后置处理
提供了一个扩展点,可以让程序员在这个位置来修改BeanDefinition,比如制定初始化方法
实例化后
提供了一个扩展点,可以让程序员在这个位置针对Bean对象做一些处理,比如执行方法、给某个属性赋值等
属性填充
给某个属性赋值
处理@Autowired注解
处理@Resource注解
处理@Value主键
等等...
Aware回调
BeanNameAware
回传beanName给bean对象
BeanClassLoaderAware
回传classLoader给bean对象
BeanFactoryAware
回传beanFactory给bean对象
初始化前
处理@PostConstruct注解
执行对应的方法
EnvironmentAware
回传环境变量给bean对象
EmbeddedValueResolverAware
回传占位符解析器给bean对象
ResourceLoaderAware
回传资源加载器给bean对象
ApplicationEventPublisherAware
回传事件发布器给bean对象
MessageSourceAware
回传国际化资源给bean对象
ApplicationContextAware
回传Spring容器ApplicationContext给bean对象
初始化
查看当前Bean对象是否实现了InitializingBean接口,如果实现了就调佣其afterPropertiesSet()方法
执行BeanDefinition中制定的初始化方法
初始化后
判断当前Bean是否进行AOP,如果需要则进行AOP
SmartInitializingSigleton
当所有的非懒加载单例Bean都创建好之后,会判断是否存在某个单例Bean实现了SmartInitializingSingleton接口,如果实现了就执行afterSingletonsIistantiated()方法