bean
@Component 是一種通用的注解,可以讓spring容器自動注冊
@Repository, @Service, and @Controller 是更特殊化的 @Component 注解
如@Repository 支持事務(wù)異常處理
@RestController annotation from Spring MVC is composed of @Controller and
@ResponseBody.
@Resource - 根據(jù)字段name來注入
@SpringBootTest 用junit-test 啟動springBoot
初始化和銷毀
實(shí)現(xiàn)InitializingBean ,中重寫afterPropertiesSet() 該bean對象會在初始化的時候被調(diào)用,
DisposableBean 在對象被銷毀的時候 回調(diào) destroy() 方法.
preInstantiateSingletons() 會初始化所有的bean對象 從
Class- DefaultListableBeanFactory - beanDefinitionNames 中拿到定義
beanUtil-instantiateClass
初始化bean 依賴 AbstractAutowireCapableBeanFactory-populateBean
refreshContext(context)- invokeBeanFactoryPostProcessors(beanFactory); 初始
化 registerBeanDefinition
isCandidateComponent 通過有沒有注解來判斷 是否加入candidate
//spring 注入依賴
ReflectionUtils.makeAccessible(field);
field.set(bean, value);
大致描述一下 beanDefinition -
目前簡單得講最原始得一種 解析DefaultListableBeanFactory->beanDefinition
在refreshContext(context)- invokeBeanFactoryPostProcessors(beanFactory) 來填充beanDefinitionMap
通過springBoot得啟動類 如SpringApplication.run(DemoSourceApplication.class, args);
拿到DemoSourceApplication.class, 得basepath. 通過JAVA Recoure 類 資源來解析下面所有得jar class文件, 裝載進(jìn)入一個集合, 在通過循環(huán)這個集合 解析是否 是否有注解 是否滿足isCandidateComponent ,滿足就加入 ,目前位置就會有所有需要初始化類得bean-definition
大致得初始化流程-
入口-
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
this.beanDefinitionNames 拿到所有得bean定義
通過AbstractBeanFactory->getbean 去實(shí)例化生成bean對象
這里實(shí)例化bean對象是通過原始java.lang 反射包去生成對象,
同時最重要的一點(diǎn)也是
如果對象中存在依賴,也是spring對象,
如
class A{
@Autoware
B b;
}
class B{
@AutoWare
C c;
}
class C{}
這時候spring得初始化順序是 先初始化A , 在初始化 B 在初始化C
遞歸裝載, 然后把C賦值給B , 在把B賦值給A
通過
ReflectionUtils.makeAccessible(field);
field.set(bean, value);
初始化所有的 web-path
在requestMappingHandlerMapping 這個對象實(shí)例化的時候調(diào)用initializeBean-> invokeInitMethods ->.afterPropertiesSet()
初始化時關(guān)鍵一步 -
// Create bean instance.
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
在getObjectForBeanInstance 方法中如果這個初始化對象實(shí)現(xiàn)了FactoryBean
那么這個實(shí)列 會調(diào)用sharedInstance 中g(shù)etObject () 方法 返回正在的實(shí)例