文章目录
前言
- 分析为两种springboot、单独调用
- springboot调用
AnnotationConfigServletWebServerApplicationContext
- 单独调用
AnnotationConfigApplicationContext
- springboot调用
AnnotatedBeanDefinitionReader
如果单从类名分析,说的就是 注解 BeanDefinition 读取
注释:实用的适配器,用于编程的方式注册 Bean,这是的替代ClassPathBeanDefinitionScanner
,仅对显式注册的类的注解解析,简单来说这个类是显示的注册一个类,并且会读取这个类上的注解进行解析~
源码分析
AnnotationConfigApplicationContext
调用进行分析
public AnnotationConfigApplicationContext() {
super();
/**
创建一个用于以编程方式注册Bean类。
并且完成了spring内部一些(后置处理器)的注册
*/
this.reader = new AnnotatedBeanDefinitionReader(this);
}
构造函数
传递了一个AnnotationConfigApplicationContext(BeanDefinitionRegistry)
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
//创建了一个 StandardEnvironment()
this(registry, getOrCreateEnvironment(registry));
}
调用 getOrCreateEnvironment
这个方法就是去创建 StandardEnvironment
去了,区别不同的是做了一个判断,这里为什么需要这么一个判断?既然都是一样的直接返回不就好了嘛?带着疑问我们继续看下个方法
private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) {
// 判断当前的 是不是 BeanDefinitionRegistry
// 这里为什么要有这么一个判断呢?
// 那其实可以看看 BeanDefinitionRegistry 实际跟 EnvironmentCapable 并没有关系,
// 这里需要注意的是 registry 的类型是什么?是 AnnotationConfigApplicationContext
// 如果是 AnnotationConfigApplicationContext 类型的话会初始化一个 StandardEnvironment 对内部进行一个赋值,然后在返回
if (registry instanceof EnvironmentCapable) {
//强转调用 getEnvironment()--> 去创建 StandardEnvironment()
return ((EnvironmentCapable) registry).getEnvironment();
}
// 不是 EnvironmentCapable 的话则直接创建,
return new StandardEnvironment();
}
个人见解这里是必须要返回一个 StandardEnvironment() 由于StandardEnvironment() 是下面流程不可缺少的一环,只是取决于谁去维护这个 StandardEnvironment
这也就是如果是ApplicationContext
的话就由ApplicationContext
而如果不是的话那可能是你在单独调用那就不需要维护,只需要不影响流程即可…
调用 getEnvironment
这里是采用单例模式创建了一个 Environment
,也就说当 registry
参数是 EnvironmentCapable
的实现类的时候会初始化一个 StandardEnvironment
对象并且进行赋值做一个赋值动作
// 这里其实可以看到是一个单例模式~~~
public ConfigurableEnvironment getEnvironment() {
// 如果为 null
if (this.environment == null) {
// 这里就会创建一个
this.environment = createEnvironment();
}
//然后返回
return this.environment;
}
说明
- 通过上面的方法分析,我们得出了结论:如果
registry
参数是EnvironmentCapable
的实现类的时候会初始化一个StandardEnvironment
对象并且进行赋值做一个赋值动作,由于我们知道BeanDefinitionRegistry
的实现类有很多,但是其实现类中可能并没有去实现EnvironmentCapable
所以会进行一个判断强转处理,这里可以去看扩展知识
调用构造函数
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
this.registry = registry;
//ConditionEvaluator
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
//把一些自动注解处理器加入到AnnotationConfigApplicationContext下的BeanFactory的BeanDefinitions中
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
创建 ConditionEvaluator
- 创建了 StandardEnvironment
- 创建了 ConditionEvaluator(registry, environment,null) 赋值给 conditionEvaluator
- registry 是 AnnotationConfigApplicationContext
- environment 是 StandardEnvironment
- 创建 ConditionContextImpl 赋值给 context
- registry 是 AnnotationConfigApplicationContext
- beanFactory 是 DefaultListableBeanFactory
- environment 是 StandardEnvironment
- resourceLoader 是 AnnotationConfigApplicationContext
- classLoader 是 DefaultListableBeanFactory 中的 classLoader
调用registerAnnotationConfigProcessors
public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
registerAnnotationConfigProcessors(registry, null);
}
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, @Nullable Object source) {
//这里获取的就是 DefaultListableBeanFactory()
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null) {
/**
* AnnotationAwareOrderComparator主要能解析@Order和@Priority
*/
if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
//设置一个值
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
}
/**
* ContextAnnotationAutowireCandidateResolver 提供处理延迟加载的功能
*/
if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
// 创建一个
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
}
}
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
//去注册 ConfigurationClassPostProcessor
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
//这里是去注册 @Autowired 的 AutowiredAnnotationBeanPostProcessor 后置处理器
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
//注册 CommonAnnotationBeanPostProcessor
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 注册PersistenceAnnotationProcessor
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition();
try {
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
AnnotationConfigUtils.class.getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
}
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 注册 EventListenerMethodProcessor
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
// 注册 DefaultEventListenerFactory
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
return beanDefs;
}
注册 ConfigurationClassPostProcessor
public static final String CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalConfigurationAnnotationProcessor";
//去注册 ConfigurationClassPostProcessor
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
注册AutowiredAnnotationBeanPostProcessor
public static final String AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalAutowiredAnnotationProcessor";
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
注册RequiredAnnotationBeanPostProcessor
public static final String REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalRequiredAnnotationProcessor";
if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
注册CommonAnnotationBeanPostProcessor
- 这里做了一个
jsr250Present
的判断
public static final String COMMON_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalCommonAnnotationProcessor";
private static final boolean jsr250Present = ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader());
//按理说 @Resource 不可能不存在的.. 因为本身就在JAVA当中
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
注册PersistenceAnnotationProcessor
- 这样也是通过做了一个JAP的注解判断,如果有则加载,不然则不进行加载
public static final String PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalPersistenceAnnotationProcessor";
private static final String PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME =
"org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor";
private static final boolean jpaPresent = ClassUtils.isPresent("javax.persistence.EntityManagerFactory", classLoader) &&
ClassUtils.isPresent(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, classLoader);
// 如果JPA的包存在则进行加载.
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition();
try {
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
AnnotationConfigUtils.class.getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
}
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
注册 EventListenerMethodProcessor
- 这里注册了监听器
public static final String EVENT_LISTENER_PROCESSOR_BEAN_NAME =
"org.springframework.context.event.internalEventListenerProcessor";
// 注册 EventListenerMethodProcessor
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
注册 DefaultEventListenerFactory
public static final String EVENT_LISTENER_FACTORY_BEAN_NAME ="org.springframework.context.event.internalEventListenerFactory";
// 注册 DefaultEventListenerFactory
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
调用registerPostProcessor()
private static BeanDefinitionHolder registerPostProcessor(
BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {
// 设置为 spring 内部Bean
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
/**
* 注册到 容器中
*/
registry.registerBeanDefinition(beanName, definition);
return new BeanDefinitionHolder(definition, beanName);
}
调用registerBeanDefinition()方法
- BeanDefinition(RootBeanDefinition)
- name
/**
* Map of bean definition objects, keyed by bean name.
* <br/ >Bean 映射BeanDefinition
*/
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
//要注册的Bean,按照顺序逐一注册
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
//先去Map去一次,如果存在,判断允许不允许覆盖,
BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
if (existingDefinition != null) {
//是否允许覆盖
if (!isAllowBeanDefinitionOverriding()) {
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
// cdoe....
//进行覆盖
this.beanDefinitionMap.put(beanName, beanDefinition);
} else {
//判断容器是否已经创建,如果已经创建创建则走这里
if (hasBeanCreationStarted()) {
// 对 beanDefinitionMap 加锁,保证线程安全
synchronized (this.beanDefinitionMap) {
// 将 name 和 beanDefinition 放到map中
this.beanDefinitionMap.put(beanName, beanDefinition);
List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
updatedDefinitions.addAll(this.beanDefinitionNames);
updatedDefinitions.add(beanName);
this.beanDefinitionNames = updatedDefinitions;
removeManualSingletonName(beanName);
}
} else {
// 主要就是这里,将 name和 beanDefinition 存到一个地方去
this.beanDefinitionMap.put(beanName, beanDefinition);
// 将 name 放到 集合中
this.beanDefinitionNames.add(beanName);
//暂时不用关系..还没有用到.
removeManualSingletonName(beanName);
}
this.frozenBeanDefinitionNames = null;
}
if (existingDefinition != null || containsSingleton(beanName)) {
resetBeanDefinition(beanName);
} else if (isConfigurationFrozen()) {
clearByTypeCache();
}
}
后言
- 创建
AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry)
赋值给reader
- registry 传递是 this,this 是 AnnotationConfigApplicationContext
- 调用
AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment)
- registry 传递是 AnnotationConfigApplicationContext
- environment 是从
getOrCreateEnvironment()
获取或者创建StandardEnvironment
- 创建
ConditionEvaluator
赋值给conditionEvaluator
—这里的代码上面分析过了
- 调用
registerAnnotationConfigProcessors(this.registry)
传递了 AnnotationConfigApplicationContext- 初始化的时候会帮我们添加几个默认的后置处理器,注册到spring容器当中的后置处理器都会被包装一下包装成
RootBeanDefinition
- 然后会存在 一个Map里面,
name
和BeanDefinition
做一个映射 - 还会将
name
存到一个List里面
- 初始化的时候会帮我们添加几个默认的后置处理器,注册到spring容器当中的后置处理器都会被包装一下包装成
流程图
扩展知识
单独使用 AnnotatedBeanDefinitionReader
让我们单独玩玩AnnotatedBeanDefinitionReader
,可以看到当创建 AnnotatedBeanDefinitionReader
是需要传递一个参数,源码也是这样
public class AnnotatedBeanDefinitionReaderContext {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
AnnotatedBeanDefinitionReader definitionReader = new AnnotatedBeanDefinitionReader(beanFactory);
definitionReader.registerBean(User.class);
User bean = beanFactory.getBean(User.class);
System.out.println(bean);
}
}
class User{}
通过上面这个Demo 我们可以明确的知道 Bean的注册是委托给了 DefaultListableBeanFactory,所以 可以通过 DefaultListableBeanFactory 获取到User类 而AnnotatedBeanDefinitionReader 本身仅仅只有注册功能,并没有获取的功能
关于getEnvironment
需要说明的时候 当我们去创建 AnnotatedBeanDefinitionReader
的时候这个类时候当你传递的参数是 BeanDefinitionRegistry
这个类型的时候就都可以去创建 AnnotatedBeanDefinitionReader
public class AnnotatedBeanDefinitionReaderContext {
public static void main(String[] args) {
// 比如 DefaultListableBeanFactory 就是实现了 BeanDefinitionRegistry
// 但是 并没有实现 EnvironmentCapable 接口,也就会去直接创建,
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
AnnotatedBeanDefinitionReader definitionReader = new AnnotatedBeanDefinitionReader(beanFactory);
//而我们的 AnnotationConfigApplicationContext 就是同时实现了 BeanDefinitionRegistry 和 EnvironmentCapable
AnnotationConfigApplicationContext value = new AnnotationConfigApplicationContext();
AnnotatedBeanDefinitionReader definitionReader = new AnnotatedBeanDefinitionReader(value);
}
}
后续文章
- 源码-1:ApplicationContext-1
- 源码-2:ApplicationContext-2
- 源码-3:ApplicationContext-3
- 源码-4:ApplicationContext-4