《圣经》旧约.创世纪:起初,神创造天地。地是空虚混沌,渊面黑暗; 神的灵运行在水面上。神说:“要有光。”就有了光。 神看光是好的,就把光暗分开了。 神称光为昼,称暗为夜。有晚上,有早晨,这是头一日。
《圣经》旧约.创世纪
目录
2.Spring是如何使用BeanDefinition的呢?
3.1.1 创建AnnotatedBeanDefinitionReader
3.1.2 创建ClassPathBeanDefinitionScanner
1.什么是BeanDefinition?
Spring的Bean具有自己的属性、构造函数参数和很多具体的相关信息。BeanDefinition是用来描述Bean的这些信息的。类似与Java世界中,class Class这个类用来描述各种对象一样。
在java项目中,用户定义的各种xx.java文件要让JVM认识,需要事先通过编译器将其编译成xx.class文件。然后再通过ClassLoader读取xx.class文件将其加载到JMM的方法区Method Area。
在Spring项目中,用户定义了可以让Spring管理的注解类(@Component, @Service, @Repository)。Spring容器初始时,Spring就通过AnnotatedBeanDefinitionReader去获取这些类的注解信息,并将其翻译整合到beanDefinitionMap、beanDefinitionNames两个数据结构的实体中,等待后续的bean实例化过程使用。
BeanDefinition是什么模样呢?
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;
void setParentName(@Nullable String parentName);
String getParentName();
void setBeanClassName(@Nullable String beanClassName);
String getBeanClassName();
void setScope(@Nullable String scope);
String getScope();
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
void setDependsOn(@Nullable String... dependsOn);
String[] getDependsOn();
void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();
void setPrimary(boolean primary);
boolean isPrimary();
void setFactoryBeanName(@Nullable String factoryBeanName);
String getFactoryBeanName();
void setFactoryMethodName(@Nullable String factoryMethodName);
String getFactoryMethodName();
ConstructorArgumentValues getConstructorArgumentValues();
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
MutablePropertyValues getPropertyValues();
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
void setInitMethodName(@Nullable String initMethodName);
String getInitMethodName();
void setDestroyMethodName(@Nullable String destroyMethodName);
String getDestroyMethodName();
void setRole(int role);
int getRole();
void setDescription(@Nullable String description);
String getDescription();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
String getResourceDescription();
BeanDefinition getOriginatingBeanDefinition();
}
从定义中可以看出,BeanDefinition (bd)可以记录bean的相关定义,比如bean父类关系,作用域scope,是否懒加载islazy,依赖对象,是否可以被自动注入isAutowireCandidate,是否是FactoryBean等等常见属性。
2.Spring是如何使用BeanDefinition的呢?
我们以注解方式编写的项目举例来说,首先还是定义几个类:
package com.Hodey.learn.bean;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component("yadang")
public class Adam {
private String name;
@PostConstruct
private void init(){
name = "Adam";
}
public void sayHello(){
System.out.println("你好,我是&#