最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

【天天热闻】Spring中的字段注入是如何实现的

来源:博客园

spring中属性的注入方式

Spring中属性注入的方式包括以下几种:


(资料图片)

  1. Setter 方法注入:通过在 Bean 类中定义对应的属性setter方法,然后在 XML 配置文件或 Java 配置类中使用 或 @Value 注解来为这些属性设置数值。

  2. 构造函数注入:通过在 Bean 的构造函数中定义对应的参数来实现。在 XML 配置文件或 Java 配置类中使用 元素或 @Autowired 注解来指定参数的值。

  3. 字段注入:通过在 Bean 类中添加对应的字段,并添加 @Autowired 或 @Resource 等注解,让 Spring 自动将需要的依赖注入到该字段中。

  4. 接口回调注入:通过实现一个特定的接口,如 ApplicationContextAware 接口、BeanNameAware 接口等,并重写该接口中的对应方法,使得 Spring 在创建 Bean 时调用这些方法来完成依赖注入。

除了以上四种方式外,还可以通过自定义注入器来实现属性注入,用户可以自定义一个 Injector 实现类,并在 XML 配置文件或 Java 配置类中注册该实现类,以实现更加灵活的注入方式。

总的来说,Spring 中的属性注入主要就是通过 Bean 容器来管理各个 Bean 对象之间的依赖关系,而 Spring 提供的各种注入方式,都是为了提供更加灵活、方便地实现属性注入,以满足不同场景下的需求。

字段注入的原理

Spring 中的字段注入会使用到 Java 反射技术。

具体来说,在 Spring 对象创建时,会先通过构造函数或工厂方法等方式实例化 Bean 对象,然后再进行属性注入。对于字段注入,Spring 内部维护了一个 AutowiredAnnotationBeanPostProcessor 后置处理器,在对象创建完成后,会检查 Bean 中标记了 @Autowired 或 @Resource 注解的字段,并根据字段类型和名称在容器中寻找匹配的 Bean 对象,最终通过反射将依赖注入到对应的字段中。

下面是字段注入的具体源码实现:

public class AutowiredAnnotationBeanPostProcessor implements BeanPostProcessor {    // ...    @Nullable    private Object autowiredProperty(            String beanName, Object bean, PropertyDescriptor pd, @Nullable Object propertyValue) {        // 获取当前属性的注解信息        Method writeMethod = pd.getWriteMethod();        Annotation[] annotations = bridge.getAnnotations(writeMethod);        for (Annotation ann : annotations) {            if (ann instanceof Autowired) {                // 如果是 @Autowired 注解,则从容器中查找并注入依赖                Object value = autowireByType(                        beanName, bean, pd.getPropertyType(), pd.getName(), ann);                if (value != null) {                    propertyValue = value;                }            }            else if (ann instanceof Inject) {                // ...            }            else if (ann instanceof Value) {                // ...            }        }        return propertyValue;    }    @Nullable    protected Object autowireByType(            String beanName, Object bean, Class type, String fieldName, @Nullable Annotation autowiredAnnotation) {        // 获取 AutowireCapableBeanFactory 对象        AutowireCapableBeanFactory factory = getAutowiredCapableBeanFactory();        // 根据类型和名称在容器中查找 Bean 对象        Object res = null;        if (factory != null) {            DependencyDescriptor desc = new AutowireUtils.TypeDependencyDescriptor(                    type, autowiredAnnotation, true, getNonSelfDeclaredPropertiesOnly());            res = factory.resolveDependency(desc, beanName, null, null);        }        return res;    }    // ...}

在上述代码中,autowiredProperty 方法用于注入单个属性值,并依次遍历该属性上的各种注解信息。当检测到 @Autowired 注解时,则调用 autowireByType 方法对该属性进行自动装配。在 autowireByType 方法中,会调用 AutowireCapableBeanFactory 的 resolveDependency 方法,通过 type 和名称等信息在 Spring 容器中查找匹配的 Bean 对象,并返回对象实例。

总的来说,Spring 中的字段注入使用 Java 反射技术实现,可以更加灵活地管理对象之间的依赖关系。当然,反射也可能导致性能瓶颈,在实际开发中需要适度使用,并结合其他技术手段对其进行优化。

关键词: