Spring 的几种注入方法

目录

1.setter 方法注入

2.构造函数注入

3.注解注入


Spring 中的IOC 就是控制bean的容器,各个bean 之间会存在相互的引用,那在各个bean之间如何引用就显得尤为重要。

Spring 中常见的注入方法主要有:setter方法注入,构造函数注入,注解注入。

1.setter 方法注入

这种注入要是依赖于配置文件中注入

配置文件如下:

<bean id="userService" class="com.spring.UserService">
	<property name="userDao" ref="userDao"></property>
</bean>

<bean id="userDao" class="com.spring.dao.UserDao"></bean>

Spring会将property中name值的每个单词首字母转换成大写,然后再在前面拼接上"set"构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入。

对应的JAVA代码:

public class UserService{

	private UserDao userDao;
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

}

有一点需要注意:如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。

2.构造函数注入

在配置文件中,通过constructor-args 标签注入到对应的bean 中。

<bean id="userService" class="com.spring.UserService">
	<constructor-arg ref="userDao"></constructor-arg>
</bean>
<bean id="userDao" class="com.spring.dao.UserDaoJdbc"></bean>

对应的JAVA类:

public class UserService{

	private UserDao userDao;
	
	public UserService(UserDao userDao) {
		this.userDao = userDao;
	}

}

关于构造函数的注入,也会涉及到多个构造函数如何匹配的问题,这里可以通过配置文件中的index 以及type进行匹配。示例中,本来就只有一个参数的构造函数,比较简单。

3.注解注入

主要有4种注解的类可以注册bean,每种注解可以任意使用,只是语义上有所差异:

@Component 可以用于注册所有bean

@Controller 可以用于注册控制层的bean

@Service 可以用于注册服务层的bean

@Repository 可以用于注册dao层的bean

描述依赖关系的的主要有2种:

@Resource(java 注解)默认以byName的方式去匹配与属性名相同的bean 的id,如果没有找到就以byType的方式查找,如果byType找到多个,通过@Qualifier 注解(Spring注解)指定某个具体名称的bean。

@Autowired (Spring 注解) 默认以byType的方式去匹配类型相同的bean,如果只匹配到一个,那么就直接注入该bean,此时不论要注入的bean的name 是什么。如果匹配到多个,就会调用DefaultListableBeanFactory 的determineAutowireCandidate 方法来决定具体注入哪个bean。

determineAutowireCandidate 方法的逻辑是:

  1. 先找 Bean 上有@Primary 注解的,有则直接返回 bean 的 name。
  2. 再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回 bean 的 name。
  3. 最后再以名称匹配(ByName)的方式去查找相匹配的 bean。

可以简单的理解为先以 ByType 的方式去匹配,如果匹配到了多个再以 ByName 的方式去匹配,找到了对应的 bean 就去注入,没找到就抛出异常。

在配置文件中,bean的配置属性autowire有以下几种类型:

先看示例:

<bean id="auto" class="example.autoBean" autowire="byType"/>
  1. no:不采用autowire 机制,这种情况,当我们需要使用依赖注入时,只能使用</ref>标签
  2. byName:通过属性的名称自动装配(注入)。spring 会在容器中查找名称与bean属性名称一致的bean,并自动注入到bean的属性中。
  3. byType:通过类型自动装配(注入)。spring 会在容器中查找class与bean 属性类一致的bean,并自动注入到bean的属性中。
  4. constructor:类似于byType,但是通过构造函数的参数类型来匹配。
  5. default:采用父级标签(即beans的 default-autowire属性)的配置

 

原文地址:https://blog.csdn.net/u014209205

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原理介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。传统事务中回滚点的使...
今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区别,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud Netfli...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。第一步:整合pom文件,在S...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List 坑列表 = new ArrayList(2);...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇...
本篇内容主要讲解“Spring中的@Autowired和@Resource注解怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学...
今天小编给大家分享一下SpringSecurity怎么定义多个过滤器链的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“Spring的@Conditional注解怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring的@Con...
这篇文章主要介绍了SpringCloudGateway的熔断限流怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud&nb...
今天小编给大家分享一下怎么使用Spring解决循环依赖问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“Spring事务及传播机制的原理及应用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Sp...
这篇“SpringCloudAlibaba框架实例应用分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
本篇内容主要讲解“SpringBoot中怎么使用SpringMVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习...
这篇文章主要介绍“SpringMVC适配器模式作用范围是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC
这篇“导入SpringCloud依赖失败如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要讲解了“SpringMVC核心DispatcherServlet处理流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来
今天小编给大家分享一下SpringMVCHttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
这篇文章主要介绍“Spring框架实现依赖注入的原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring框架...
本篇内容介绍了“Spring单元测试控制Bean注入的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下