你所不知道的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自动注入内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    自动注入和@Autowire @Autowire不属于自动注入! 注入方式(重要) 在Spring官网上(文档),定义了在Spring中的注入方式一共有两种:set方法和构造函数. 也就是说,你想在A类里面注入另外一个B类,无论你是通过写 XML文件,或者通过 @Autowried,他们最终都是通过这个A类的set方法或者构造函数,将B类注入到A类中! 换句话说,你如果A类里面没有setB(B b){-},那你就别想通过set方法把B类注入到A类中 自动注入 首先摆出一个比较颠覆的观点:@Aut

  • 你所不知道的Spring的@Autowired实现细节分析

    前言 相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?这就要分析Spring源码才能知道了.友情提示:本篇主要是讲解Autowired的实现原理,不会分析Spring初始化的过程,不熟悉的读者可以先阅读笔者之前的一篇文章<这一次搞懂Spring的Bean实例化原理>. 正文 在Spring Bean的整个创建过程中会调用很多BeanPostProcessor接口的的实现类: 上图是

  • 你一定不知道的Java Unsafe用法详解

    目录 Unsafe是什么 如何正确地获取Unsafe对象 Unsafe实现CAS锁 使用Unsafe创建对象 Unsafe加载类 总结 Unsafe是什么 首先我们说Unsafe类位于rt.jar里面sun.misc包下面,Unsafe翻译过来是不安全的,这倒不是说这个类是不安全的,而是说开发人员使用Unsafe是不安全的,也就是不推荐开发人员直接使用Unsafe.而且Oracle JDK源码包里面是没有Unsafe的源码的.其实JUC包里面的类大部分都用到了Unsafe,可以说Unasfe是j

  • 你可能不知道的package.json属性详解

    目录 概述 name version description keywords homepage bugs license 和用户相关的属性:author,contributors files main bin man directories directories.lib directories.bin directories.man directories.doc directories.example repository scripts config dependencies URLsa

  • 你可能不知道的JavaScript位运算符详解

    目录 概览 位操作符概览 位操作支持多少位? 负数的无符号右移 -2 >>> 1为什么输出2147483647? 状态控制 权限控制 判断奇偶数 交换两个变量的值 判断整数是否相等 判断是否为负数 正浮点数取整 正负浮点数取整 十进制转换成二进制 二进制转换成十进制 参考 概览 本文详细剖析JavaScript的位运算符,其涉及的计算机原理和操作效果. 然后从实战的角度出发,罗列相关的应用场景. 位操作符概览 运算符 描述 示例 按位与(AND) 两个操作数对应的比特位都是1时,结果才为

  • Spring AOP拦截-三种方式实现自动代理详解

    这里的自动代理,我讲的是自动代理bean对象,其实就是在xml中让我们不用配置代理工厂,也就是不用配置class为org.springframework.aop.framework.ProxyFactoryBean的bean. 总结了一下自己目前所学的知识. 发现有三种方式实现自动代理 用Spring一个自动代理类DefaultAdvisorAutoProxyCreator: <bean class="org.springframework.aop.framework.autoproxy.

  • Spring组件自动扫描详解及实例代码

    Spring组件自动扫描详解及实例代码 问题描述 一个系统往往有成千上万的组件,如果需要手动将所有组件都纳入spring容器中管理,是一个浩大的工程. 解决方案 Spring 提供组件扫描(component scanning)功能.它能从classpath里自动扫描.侦测和实例化具有特定注解的组件.基本的注解是@Component,它标识一个受Spring管理的组件.其他特定的注解有@Repository.@Service和@Controller,它们分别标识了持久层.服务处和表现层的组件.

  • JSP 中spring事务配置详解

    JSP 中spring事务配置详解 前几天被问到,如何防止服务器宕机,造成的数据操作的不完全. 问了一下同事,是事务.哎,恍然大悟,迷糊一时了. 声明式的事务配置,这个是最推荐的,配置到service层. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context=&

  • Springboot @Configuration与自动配置详解

    不知道大家第一次搭SpringBoot环境的时候,有没有觉得非常简单.无须各种的配置文件,无须各种繁杂的pom坐标,一个main方法,就能run起来了.与其他框架整合也贼方便,使用EnableXXXXX注解就可以搞起来了! 所以今天来讲讲SpringBoot是如何实现自动配置的~ @SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot需要运行这个类的main方法来启动SpringBoot应用: 先看

  • Springboot框架实现自动装配详解

    目录 序言 从程序的使用去入手分析 序言 springboot框架价值,可以简单快速的构建独立的spring生产级别应用.springboot主要有以下的特性: 1.创建独立的Spring应用 2.直接嵌入Tomcat等Web容器(不需要部署WAR文件) 3.提供固化的“starter”依赖,简化构建配置 4.当条码满足时自动装配Spring货第三方类库 5.提供运维的特性,如指标信息,健康检查和外部配置 6.不需要XML配置. 下面就以springboot启动的时候,是如何实现mybatis自

随机推荐