时机:创建对象之后注入
set注入,基于set方法实现的,底层会通过反射机制调用属性对应的set方法然后给属性赋值。这种方式要求属性必须对外提供set方法。
先看两个java类
- dao层:
java
package com.zhanghan.spring.dao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class userDao {
public static final Logger log = LoggerFactory.getLogger(userDao.class);
public void insert() {
log.info("数据库正在保存用户信息");
}
}v
- service层:
java
package com.zhanghan.spring.service;
import com.zhanghan.spring.dao.userDao;
public class userService {
private userDao userDao;
// setter方法
//set注入必须要有setter方法
public void setUserDao(userDao userDao) {
this.userDao = userDao;
}
public void saveUser() {
userDao.insert();
}
}
userService中声明了一个userDao类用来操作数据库,此时我们就要提供set方法,好让spring调用set方法为它赋值
spring配置文件:
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--这是spring的配置文件-->
<!--为什么是spring的?而不是mybais的? -->
<!-- 根元素是 <beans> ✓使用了 Spring 的命名空间 ✓包含 <bean> 配置标签 ✓ --><!-- IDEA提供了模板可以直接创建 -->
<!-- 这个文件名不一定叫spring.xml,可以是其他名字 -->
<!-- 最好放在类路径resources下,相当于放到了类的根路径,下方便移植 -->
<!-- 配置bean,这样spring可以帮助我们管理对象 -->
<!-- bean的两个重要属性 id代表对象的id(可以中自定义,随便取名,不过一般要求见名知意),class代表对象所属的类,class里要写全类名 -->
<bean id="userDao" class="com.zhanghan.spring.dao.userDao"/>
<bean id="userService" class="com.zhanghan.spring.service.userService">
<!-- 想要spring创建UserService对象,并把UserDao对象注入到UserService对象中,需要配置property标签,提供setter方法
name属性表示setter方法名,要求:去掉set,第一个字母小写,
ref属性表示set方法的参数,要求:对象id,前面定义的bean的id -->
<property name="userDao" ref="userDao"/>
</bean></beans>
实现原理:
通过property标签获取到属性名:userDao
通过属性名推断出set方法名:setUserDao
通过反射机制调用setUserDao()方法给属性赋值
property标签的name是属性名。
property标签的ref是要注入的bean对象的id。(通过ref属性来完成bean的装配,这是bean最简单的一种装配方式。装配指的是:创建系统组件之间关联的动作)
可以把set方法注释掉,再测试一下 :
会报错
通过测试得知,底层实际上调用了setUserDao()方法。所以需要确保这个方法的存在。
另外,对于property标签来说,ref属性也可以采用标签的方式,但使用ref属性是多数的:
xml
<bean id="userServiceBean" class="com.powernode.spring6.service.UserService">
<property name="userDao">
<ref bean="userDaoBean"/>
</property>
</bean>
!NOTE\] 思考: 这就是我们在每个实体类上加@date注解的作用,它的底层是spring对set方法的需要