spring
2021-07-28 本文已影响0人
C_99f1
bean
@Component 是一种通用的注解,可以让spring容器自动注册
@Repository, @Service, and @Controller 是更特殊化的 @Component 注解
如@Repository 支持事务异常处理
@RestController annotation from Spring MVC is composed of @Controller and
@ResponseBody.
@Resource - 根据字段name来注入
@SpringBootTest 用junit-test 启动springBoot
初始化和销毁
实现InitializingBean ,中重写afterPropertiesSet() 该bean对象会在初始化的时候被调用,
DisposableBean 在对象被销毁的时候 回调 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文件, 装载进入一个集合, 在通过循环这个集合 解析是否 是否有注解 是否满足isCandidateComponent ,满足就加入 ,目前位置就会有所有需要初始化类得bean-definition
大致得初始化流程-
入口-
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
this.beanDefinitionNames 拿到所有得bean定义
通过AbstractBeanFactory->getbean 去实例化生成bean对象
这里实例化bean对象是通过原始java.lang 反射包去生成对象,
同时最重要的一点也是
如果对象中存在依赖,也是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 这个对象实例化的时候调用initializeBean-> invokeInitMethods ->.afterPropertiesSet()
初始化时关键一步 -
// 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 方法中如果这个初始化对象实现了FactoryBean
那么这个实列 会调用sharedInstance 中getObject () 方法 返回正在的实例