你所不知道的Spring自动注入详解

 更新时间:2020年10月18日 11:49:54   作者:ZeS丶  
这篇文章主要给大家介绍了关于你所不知道的Spring自动注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

自动注入和@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去掉,重新启动程序并查看控制台:

在这里插入图片描述

纸上得来终觉浅,绝知此事要躬行!希望大家也可以自己写写代码再验证一下!

总结

到此这篇关于你所不知道的Spring自动注入详解的文章就介绍到这了,更多相关Spring自动注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java常见基本数据结构概览

    Java常见基本数据结构概览

    这篇文章主要介绍了Java常见的几种基本数据结构,包括其含义和用法,,需要的朋友可以参考下
    2017-09-09
  • 使用spring拦截器实现日志管理实例

    使用spring拦截器实现日志管理实例

    本篇文章主要介绍了使用spring拦截器实现日志管理实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Java反射机制详解

    Java反射机制详解

    这篇文章主要介绍了Java反射机制,首先简单介绍了反射机制的预备知识,进一步分析了Java反射机制的原理、实现技巧与应用方法,需要的朋友可以参考下
    2015-12-12
  • Spring bean 加载执行顺序实例解析

    Spring bean 加载执行顺序实例解析

    这篇文章主要介绍了Spring bean 加载执行顺序实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 浅谈Java中真的只有值传递么

    浅谈Java中真的只有值传递么

    这篇文章主要介绍了浅谈Java中真的只有值传递么?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Spring Mvc中传递参数方法之url/requestMapping详解

    Spring Mvc中传递参数方法之url/requestMapping详解

    在开发中,参数传递是必不可少的一个功能,下面这篇文章主要给大家介绍了关于Spring Mvc中传递参数方法之url/requestMapping的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • JAVA装饰者模式(从现实生活角度理解代码原理)

    JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。这篇文章主要介绍了JAVA装饰者模式的相关资料,需要的朋友可以参考下
    2016-12-12
  • 详解Mybatis(五)Mapper接口

    详解Mybatis(五)Mapper接口

    这篇文章主要介绍了Mybatis Mapper接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java实现的打印螺旋矩阵算法示例

    Java实现的打印螺旋矩阵算法示例

    这篇文章主要介绍了Java实现的打印螺旋矩阵算法,结合完整实例形式详细分析了java打印螺旋矩阵的算法原理与实现技巧,需要的朋友可以参考下
    2019-10-10
  • java编程进行动态编译加载代码分享

    java编程进行动态编译加载代码分享

    这篇文章主要介绍了java编程进行动态编译加载代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论