主页

【理解Spring】自动注入对 static 字段不支持的原因

举个例子: 有一个原型类 OrderService @Component @Scope("prototype") public class OrderService { } 和另一个原型类 UserService,UserService 中有一个静态属性 OrderService orderService 并被 @Autowired 标注 @Component @Scope("prototype") public class UserService { @Autowired private static OrderService orderService; public void test() { System.out.println("t...

阅读更多

【理解Spring】依赖注入

Spring 依赖注入包含两种 [[依赖注入类型]] [[依赖注入类型#手动注入]] :手动指定属性的值 [[依赖注入类型#自动注入]] :利用 Spring 自动寻找可能的 bean 对象,并赋值到属性 其中自动注入又分为三种类型: [[依赖注入类型#XML 的 autowire 自动注入]] [[依赖注入类型#Autowire 注解自动注入]] [[依赖注入类型# @Resource 注解的自动注入]] Spring 依赖注入过程大致为: 寻找注入点 遍历注入点进行注入 注入过程中进行 依赖查找 @Autowire 注解自动注入和 @Resource 注解的自动注入有些许区别,但大体相同。 寻找注入点 @Autowire 寻找注...

阅读更多

【理解Spring】推断构造方法

代码入口: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowireConstructor org.springframework.beans.factory.support.ConstructorResol...

阅读更多

【理解Spring】Bean生命周期

Spring 最重要的功能就是帮助程序员创建对象(也就是 IOC),而启动 Spring 就是为创建 Bean 对象做准备,所以我们先明白 Spring 到底是怎么去创建 Bean 的,也就是先弄明白 Bean 的生命周期。 Bean 的生命周期就是指:在 Spring 中,一个 Bean 是如何生成的,如何销毁的 Bean 生命周期流程图 生成 BeanDefinition Spring扫描并生成 BeanDefinition 合并 BeanDefinition 合并 BeanDefinition getBean() 获取 Bean getBean() 创建 Bean Bean 创建 执行 SmartInitializingSingleton.afterSingl...

阅读更多

【理解Spring】Bean 创建

在 BeanFactory.getBean() 中,如果从单例池没有获取到 Bean,则创建 Bean 代码入口: AbstractAutowireCapableBeanFactory.createBean(String beanName, RootBeanDefinition, Object[] args) Central method of this class: creates a bean instance, populates the bean instance, applies post-processors, etc. 此方法主要目的:创建 Bean 实例,填充 Bean 实例,应用/执行 Post-Processor 等 代码调用: Abstra...

阅读更多

【理解Spring】BeanFactory.getBean()

代码入口:DefaultListableBeanFactory.preInstantiateSingletons() Spring 在合并 BeanDefinition 之后,调用 AbstractBeanFactory.getBean() 获取 Bean AbstractBeanFactory.getBean() 有许多重载方法,其最终调用的是 protected <T> T doGetBean( final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheck...

阅读更多

【理解Spring】BeanDefinition 继承

BeanDefinition 可以通过继承获得父 BeanDefinition 的属性,开发中实际运用的比较少。 非继承: <bean id="parent" class="com.azh3ng.service.Parent" cope="prototype"/> <bean id="child" class="com.azh3ng.service.Child"/> 上述情况下,child 是单例 Bean。 继承 BeanDefinition: <bean id="parent" class="com.azh3ng.service.Parent" cope="prototype"/> <bean id="child" class=...

阅读更多

【理解Spring】抽象 BeanDefinition

抽象的 BeanDefinition 不会生成 Bean,由于 BeanDefinition 有继承关系(BeanDefinition继承),所以可以定义抽象 BeanDefinition 作为其他 BeanDefinition 的父级,其中定义的属性(scope、lazy 等)可以作用到子级的 BeanDefinition 定义抽象 BeanDefinition spring.xml <bean id="user" class="com.demo.User" abstract="true"/>

阅读更多