精选文章 Java 基础之Autowired 是否是自动注入

Java 基础之Autowired 是否是自动注入

作者:Shadow_629 时间: 2020-08-05 10:05:49
Shadow_629 2020-08-05 10:05:49

Java 基础之Autowired 是否是自动注入

相信很多人对Autowired 注解理解不深入,或者是认为此注解就是spring的自动注入。相信看完本篇文章,你会有更加不一样的理解。

首先我们先看下什么是手动注入?在我们的spring应用程序中,定义多个类,其中某些类依赖某些类,xml中要描述类与类之间的依赖关系,这种由程序员定义,并且描述好依赖关系的用法,我们称之为手动注入。我们看个例子:

package com.shadow.data;

public class X {
    private Y y;

    public void setY(Y y) {
        System.out.println("hello set method ...");
        this.y = y;
    }
}
package com.shadow.data;

public class Y {

}



    
        
    
    

上面我们定义了两个类,X 依赖于 Y 类,并且我们在xml 中定义了他们的依赖关系,当我们启动spring 应用程序时候,会发现有如下打印:

hello set method ...

Process finished with exit code 0

DI(依赖注入)一共有两种主要的方式,分别是基于构造方法的依赖注入和基于setter方法的依赖注入,不管是手动装配还是自动装配都是基于这两种方式来的。@Autowired这种注入方式是上述setter方式的变体,基于反射技术,实现属性注入。

此处,需要注意的是,如果去掉X中的Y属性,打印是相同的。

spring官网有说明自动装配有四种模型分表是no、bytype、byname、constructor。由于Autowired注解首先根据类型注入,所以容易让程序员认为Autowired注解也是自动注入。其实他们不是一回事。

先给出结论,此处借用大神的一段话:依赖注入是一个过程,主要通过setter和构造方法以及一些变体的方式完成把对象依赖、或者填充上的这个过程叫做依赖注入,不管手动装配还是自动装配都有这个过程;而自动装配模型是一种完成自动装配依赖的手段体现,每一种模型都使用了不同的技术去查找和填充bean;而从spring官网上面可以看到spring只提出了4中自动装配模型(严格意义上是三种、因为第一种是no,表示不使用自动装配、使用),这四个模型分别用一个整形来表示,存在spring的beanDefinition当中,任何一个类默认是no这个装配模型,也就是一个被注解的类默认的装配模型是no也就是手动装配;其中no用0来表示;bytype用2来表示;如果某个类X,假设X的bean对应的beanDefinition当中的autowireMode=2则表示这个类X的自动装配模型为bytype;如果autowireMode=1则表示为byname装配模型。

上面代码基础上增加一个类如下:

package com.shadow.data;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        GenericBeanDefinition x = (GenericBeanDefinition)configurableListableBeanFactory.getBeanDefinition("x");
        System.out.println(x.getAutowireMode());
    }
}

可以看到打印如下:


...
2
hello set method ...

Process finished with exit code 0

如果将xml去掉,每个类上面加Component注解,如下:


@Configuration
@ComponentScan(basePackages = "com.shadow.data")
public class Main {
    public static void main(String[] args) {
        System.out.println("...");
//        ClassPathXmlApplicationContext classPathXmlApplicationContext =
//                new ClassPathXmlApplicationContext("application.xml");
    AnnotationConfigApplicationContext annotationConfigApplicationContext=
            new AnnotationConfigApplicationContext(Main.class);

    }
}

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        GenericBeanDefinition x = (GenericBeanDefinition)configurableListableBeanFactory.getBeanDefinition("x");
        System.out.println(x.getAutowireMode());
    }
}

@Component
public class X {
    @Autowired
    private Y y;

    public void setY(Y y) {
        System.out.println("hello set method ...");
        this.y = y;
    }
}

@Component
public class Y {

}
...
0

Process finished with exit code 0

打印结果如上所示,可以证明Autowired的bean definition中自动注入模型为0,不属于自动注入。

更详细的内容见大神的文章,如有侵权,请联系我删除!

参考 https://blog.csdn.net/java_lyvee/article/details/102499560

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:可信任的多方计算和验证仿真:一种扩展区块链的方法

下一篇:解决Keepalived主备都含有VIP

您可能感兴趣

  • 有关string stringbuff stringbuild 的区别

    string stringbuff stringbuild的执行效率: stringbuild>stringbuff>string String类是不可变类,任何对String的改变都会引发新的String对象的生成; StringBuffer是可变类,任何对它所指代的字符串的改变都不会产生新的对象,线程安全的。 StringBuilder是可变类,线性不安全的,不支持并发操作,不适合多线程...

  • Java异常面试题(2020最新版)

    文章目录 Java异常架构与异常关键字 Java异常简介 Java异常架构 1. Throwable 2. Error(错误) 3. Exception(异常) 运行时异常 编译时异常 4. 受检异常与非受检异常 受检异常 非受检异常 Java异常关键字 Java异常处理 声明异常 抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 直接抛出异常 封装异常再抛出 捕获异常 自定义异常 t...

  • 大型架构及配置技术ansible(一)之ansible基础,ad-hoc,批量配置管理,ansible七种武器,JSON简介,YAML简介

    一、ansible基础 6台虚拟机(2cpu,1.5G以上内存,10G以上硬盘,1块网卡) 主机名 IP地址 角色 ansible40 192.168.4.40/24 管理主机 web41 192.168.4.41/24 托管主机 web42 192.168.4.42/24 托管主机 db43 192.168.4.43/24 托管主机 db44 192.168.4.44/24 托管主机 ca...

  • java基础学习笔记(七)-反射--注解

    反射机制介绍 _Class 对象获取 反射机制是 Java 的动态性之一 动态语言 : 在程序运行时,可以改变程序的结构或变量的类型。 典型的动态语言 ”Python 、 ruby 、 JavaScripC,C++, Java 不是动态语言,但具有一定的动态性,可以称为” 准动态语言 ”, 具备类似动态语言的特性。传一块代码来动态的执行,动态的处理,Java 也能做,可以利用反射来实现类似的...

  • RabbitMQ之Exchange、Queue参数详解

    1.先来介绍RabbitMQ中的成员 Producer(生产者): 将消息发送到Exchange Exchange(交换器):将从生产者接收到的消息路由到Queue Queue(队列):存放供消费者消费的消息 BindingKey(绑定键):建立Exchange与Queue之间的关系(个人看作是一种规则,也就是Exchange将什么样的消息路由到Queue) RoutingKey(路由键):...

  • 【STM32F429开发板用户手册】第38章 STM32F429的FMC总线应用之是32路高速IO扩展

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 本章教程为大家讲解利用STM32429的FMC总线扩展出32路高速IO,且使用简单,实际项目中也比较有实用价值。 目录 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 38.1 初...

  • 【计算机网络】第七章:网络安全

    【计算机网络】第七章:网络安全 目录 网络安全问题概述 1.1.计算机网络面临的安全性威胁 1.2.被动攻击和主动攻击 1.3.计算机网络通信安全的目标 1.4.恶意程序(rogue program) 1.5.计算机网络安全的内容 1.6.一般的数据加密模型 两类密码体制 一、对称密钥密码体制 1.1.对称密钥的缺点与优点 1.2.数据加密标准 DES 1.3.DES 的保密性 二、公钥密码...

  • Redis到底该怎么搞呢?主从复制以及redis复制演进全面进攻

    一、前言 通过持久化功能,Redis保证了即使在服务器宕机情况下数据的丢失非常少。但是如果这台服务器出现了硬盘故障、系统崩溃等等,不仅仅是数据丢失,很可能对业务造成灾难性打击。为了避免单点故障通常的做法是将数据复制多个副本保存在不同的服务器上,这样即使有其中一台服务器出现故障,其他服务器依然可以继续提供服务。当然Redis提供了多种高可用方案包括:主从复制、哨兵模式的主从复制、以及集群。 本...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。