# spring-master **Repository Path**: vincewm/spring-master ## Basic Information - **Project Name**: spring-master - **Description**: 手写spring源码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-25 - **Last Updated**: 2024-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 注解容器类构造方法创建Bean: - **获取Bean扫描路径:**获取配置类的Class对象,基于反射获取@ComponentScan注解里设置的扫描路径; - **扫描Bean:**遍历扫描路径里每个类的字节码文件,用类加载器加载成class对象,基于反射判断@Component等注解,有的话这个类就是Bean类。 - **BeanPostProcessor实例化后存列表:**如果Bean类是BeanPostProcessor接口的实现类,那么就将这个Bean类实例化并存进成员变量List里; - **创建并赋值BeanDefinition对象:**创建BeanDefinition对象并赋值,type变量赋值Bean类的class对象,scope变量赋值作用域(通过反射获取@Scope注解值)。BeanDefinition存储Bean的对象、作用域等元信息。 - **beanDefinitionMap添加键值对:**把Bean名和它对应的BeanDefinition对象,以键值对形式添加到容器类成员变量beanDefinitionMap里。beanDefinitionMap线程安全,是ConcurrentHashMap类型。 - **实例化:**基于反射,根据Bean类的Class对象创建实例。实例化这个方法在getBean()时候也会用到,所以抽取成私有方法。 - **属性填充:**基于反射,根据Bean类的Class对象获取它所有属性,将注解了@Autowired等的属性开启私有成员访问限制,通过getBean(名或类)方法给该属性填充它的Bean对象。 - **处理Aware回调:**如果Bean实例实现了BeanNameAware接口(通过instanceof判断),调用Bean重写的setBeanName()方法,给Bean实例的beanName变量赋值。 - **执行所有BeanPostProcessor的初始化前方法:**遍历BeanPostProcessor列表,执行每个BeanPostProcessor对象里的postProcessBeforeInitialization()方法。本方法可以通过JDK的Proxy.newProxyInstance()实现动态代理返回目标对象的代理对象。 - **初始化:**如果Bean实例实现了InitializingBean接口(通过instanceof判断),调用Bean重写的afterPropertiesSet()方法,处理初始化逻辑。afterPropertiesSet译为“在属性填充之后” - **执行所有BeanPostProcessor的初始化后方法:**遍历BeanPostProcessor列表,执行每个BeanPostProcessor对象里的postProcessAfterInitialization()方法。本方法可以通过JDK的Proxy.newProxyInstance()实现动态代理返回目标对象的代理对象。