你所不知道的Spring自动注入详解
作者:ZeS丶 发布时间:2021-09-04 19:30:08
自动注入和@Autowire
@Autowire不属于自动注入!
注入方式(重要)
在Spring官网上(文档),定义了在Spring中的注入方式一共有两种:set方法和构造函数。
也就是说,你想在A类里面注入另外一个B类,无论你是通过写 XML文件,或者通过 @Autowried,他们最终都是通过这个A类的set方法或者构造函数,将B类注入到A类中!
换句话说,你如果A类里面没有setB(B b){…},那你就别想通过set方法把B类注入到A类中
自动注入
首先摆出一个比较颠覆的观点:@Autowire不属于自动注入!
如果要讨论自动注入,我们先要了解什么是自动注入,什么是手动注入。
手动注入:在Spring 1.x的时候,我们想要在A类中注入B类,我们只能通过在xml配置文件中,加上< property >标签。也就是说,如果我们想在A类中注入100个类,我们就要重复着写100个< property > 。而Spring为了我们能少码点字,就提供了 @Autowired 注解,通过这个注解,我们就可以更加轻松的手动注入需要的类
自动注入:如果在A类里面,需要用到B类,C类等等…我不需要重复着写100个< property >或者100个@Autowired。而是只需要注明需要哪些类即可
既然是自动,那就代表我啥都不用做,就连一个 @Autowire 我都不加的情况下我让B类注入进A类,这才算真正的自动注入
证明:
首先,我们先看看最原始的,通过xml的注入类:
<bean id="exampleBean" class="examples.ExampleBean">
<!-- setter injection using the nested ref element -->
<property name="beanOne">
<ref bean="anotherExampleBean"/>
</property>
</bean>
<bean id="anotherExampleBean" class="examples.AnotherBean"/>
对应的类:
public class ExampleBean {
private AnotherBean beanOne;
public void setBeanOne(AnotherBean beanOne) {
this.beanOne = beanOne;
}
}
这是Spring官网上的一个例子,在最开始,我们通过在XML中追加<property>属性来为类加上其所需要的类。这种手动注入的方式十分的繁琐,所以后面出现了@Autowire注解来进行注入!说白了,就是人们为了偷懒,用一个@Autowire注解代替了写一大串的property属性!(先这么理解,底层源码肯定不是这么做的!)这样的话,还能说 @Autowire 是自动注入了吗?
对于自动注入,在Spring中提供了下面4种方式(甚至我可以更加负责任的告诉你们,在Spring源码中有5种)
先根据官方文档提供的4种方法进行解释:
no:就是不要自动装配
byName:通过名字进行自动装配
byType:通过类型进行自动装配
constructor:通过构造函数进行自动装配
最开始我有写到,在Spring中,自动注入的方式就只有两种,通过set()方法和构造函数。所以 byName和 byType 都是通过 set()进行装配的。
代码演示:通过byType方式进行自动注入
通过在<beans>
标签的末尾加上 default-autowire="byType"
来实现Spring的自动注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"
default-autowire="byType">
<bean id="defaultAutowireService" class="com.spring.autowiringModes.DefaultAutowireService">
</bean>
<bean id="byTypeDemo" class="com.spring.autowiringModes.ByTypeDemo"/>
</beans>
Java类:
public class DefaultAutowireService {
ByTypeDemo byTypeDemo;
public ByTypeDemo getByTypeDemo() {
return byTypeDemo;
}
public void setByTypeDemo(ByTypeDemo byTypeDemo) {
this.byTypeDemo = byTypeDemo;
}
}
启动类:
public class XmlTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("spring.xml");
DefaultAutowireService bean =
context.getBean("defaultAutowireService", DefaultAutowireService.class);
System.out.println(bean.getByTypeDemo());
}
}
控制台:
如果这时我们把xml文件中的default-autowire
去掉,重新启动程序并查看控制台:
纸上得来终觉浅,绝知此事要躬行!希望大家也可以自己写写代码再验证一下!
来源:https://blog.csdn.net/weixin_46357454/article/details/109125108


猜你喜欢
- 本文实例讲述了C#更改tabControl选项卡颜色的方法。分享给大家供大家参考,具体如下:private void Form1_Load(
- (一)打包与运行SpringBoot项目快速启动(Linux版)基于Linux (CenteroS7)安装JDK,且版本不低于打包时使用的J
- JdbcTypeInterceptor运行时自动添加 jdbcType 属性 * 签名@Intercepts({
- 1. 简单工厂介绍简单工厂有一个具体的工厂类,可以生产不同的产品,属于创建型设计模式。注意:简单工厂模式 不属于23种设计模式之列2. 简单
- 好多时候,我们都需要知道某些目录下的文件什么时候被修改、删除过等,如果能用miniFilter驱动过滤来做的话当然是最好不过了,这是内核级别
- Android 调用系统相机拍摄获取照片的两种方法实现实例在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的
- 实现要求1、使用Java图形界面组件设计软件,界面如图所示。2、软件能够满足基本的“加、减、乘、除"等运算要求。3、程序代码清晰,
- 本文研究的主要是高吞吐、线程安全的LRU缓存的相关内容,具体介绍如下。几年以前,我实现了一个LRU缓存用来为关键字来查找它的id。数据结构非
- 目录一 为什么要用锁二 synchronized怎么实现的三 CAS来者何人四synchronized和CAS孰优孰劣轻量级锁重量级锁总结提
- 1.扫描所有场景,保存并添加到Build Settings中using System.Collections;using System.Co
- 一、前言让我们先理一下springfox与swagger的关系。swagger是一个流行的API开发框架,这个框架以“开放API声明”(Op
- MyBatis的注解实现复杂映射开发实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解
- 本文实例讲述了Android实现捕获未知异常并提交给服务器的方法。分享给大家供大家参考,具体如下:在Android应用中,即便应用已经投放市
- jdk下载并配置下载jdk下图是自己资源管理器中jdk的安装路径,双击然后next就好,不需要改什么配置手里没有安装包的,下载地址在这里 :
- 在java中,static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能;被static关键
- 本文提供了基于MD5加密16位和32位的方法,具体内容如下import java.io.IOException;import java.ma
- 效果图:后来又出了两篇,也可以看一下Android选择与上传图片之PictureSelector教程Android选择与上传图片之Matis
- 由于之前一直在使用spring-boot开发,但一直苦恼于不知道如何利用debug调试代码.在网上查找了很多文章之后。学习之余决定把spri
- Java 分割字符串java.lang.String 的 split() 方法, JDK 1.4 or laterpublic
- 本文实例为大家分享了java实现简单斗地主的具体代码,供大家参考,具体内容如下第一种方法 /** * @param args */ /**