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

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

作者:Shadow_629 时间: 2021-02-05 09:43:10
Shadow_629 2021-02-05 09:43:10
【摘要】Java 基础之Autowired 是否是自动注入 
相信很多人对Autowired 注解理解不深入,或者是认为此注解就是spring的自动注入。相信看完本篇文章,你会有更加不一样的理解。 
首先我们先看下什么是手动注入?在我们的spring应用程序中,定义多个类,其中某些类依赖某些类,xml中要描述类与类之间的依赖关系,这种由程序员定义,并且描述好依赖关系的用法,我们称之为手动注入。我们看...

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占位
分享文章到微博
分享文章到朋友圈

上一篇:海康监控摄像头能做视频直播那些事!

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

您可能感兴趣

  • Java程序员面试中的多线程问题

    2013-3-5 16:32| 发布者: sxwgf| 查看: 1735| 评论: 0|来自: 伯乐在线  http://web.itivy.com/article-184-1.html     很多核心JAVA面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时...

  • 记不住但是实用的java方法

    一、字符串转换方法     1、toString,需要保证调用这个方法的类、方法、变量不为null,否则会报空指针。    2、String.valueOf。这个方法在使用的时候是有些特殊的。一般情况下,如果是确定类型的null传入,返回的是字符         串“null”,而如果直接传入null,则会发生错误     3、(String) 字符...

  • Java泛型---入门

    为什么要引入泛型--->定义输入对象类型,方便使用、安全     1)对于一个Student类,存放一个Object对象,向内部存储数据,使用以下方法:     没有泛型的数据存储与读取     创建一个PO类(JavaBean),实体化对象,存储数据的类 /** * PO类(实体化对象,用于存储数据的类),JavaBean * @author ...

  • 【java多线程】---线程创建、start、run

    线程创建、start、run   一、创建线程方式      java创建线程的方式,主要有三种:类Thread、接口Runnable、接口Callable。 1、Thread和Runnable进行比较 他们之间的区别  1、实现Runnable的类更具有健壮性,避免了单继承的局限。  2、Runnable更容易实现资源共享,能多个线程同时处理一个资...

  • Java爬虫实践:Jsoup+HttpUnit爬取今日头条、网易、搜狐、凤凰新闻

    0x0 背景 最近学习爬虫,分析了几种主流的爬虫框架,决定使用最原始的两大框架进行练手:  Jsoup&HttpUnit  其中jsoup可以获取静态页面,并解析页面标签,最主要的是,可以采用类似于jquery的语法获取想要的标签元素,例如: //1.获取url地址的网页html html = Jsoup.con...

  • 自动递增和递减

    自动递增分为前缀递增和后缀递增;自动递减也是分为前缀递减和后缀递减。 前缀递增或递减是先运算再生成值,后缀递增或递减是先生成值再运算。 前缀递增:表示“++”操作符位于变量或表达式的前面。 后缀递增:表示“++”操作符位于变量或表达式的后面。 前缀递减:表示“--”操作符位于变量或表达式的前面。 后缀递减:表示“--”操作符位于变量或表达式...

  • Java中的方法

    在其他语言中,方法称为过程或函数。带返回值的方法称为函数,返回值类型为void的方法称为过程。 定义方法 public static int max(int num1,int num2){ return 0;} public static 为修饰符 int 为返回值类型 max 为方法名 int num1 为形式参数 int num1,int num...

  • Java容器---MyMap02

    鉴于使用数组实现Map存在的一些问题,引入HashCode,实现HashMap的一些功能 /** * Map编程优化 * Map的底层实现为数组+链表 * 1.提高查询效率,避免循环遍历,使用Hashcode快速定位存储位置 * * Hashcode与equals的关系 * 1.equals相同的对象必然存在拥有相同的Hashcode值...

CSDN

CSDN

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

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

免费套餐,马上领取!
Java 基础之Autowired 是否是自动注入介绍:华为云为您免费提供Java 基础之Autowired 是否是自动注入在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多Java 基础之Autowired 是否是自动注入的相关内容。| 移动地址: Java 基础之Autowired 是否是自动注入 | 写博客