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属性)的配置

 

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...