(5)spring的set注入

时机:创建对象之后注入
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方法的需要

相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
CS创新实验室10 小时前
量子计算机的操作系统:原理、实践与经典架构之对比
架构·操作系统·量子计算
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
人间凡尔赛10 小时前
WAIC 2026 落幕,AI Agent 开发已进入 Harness 架构时代
人工智能·架构
极客侃科技11 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
晏宁科技YaningAI11 小时前
VoIP系统的工程实现模型:从信令控制到媒体传输的完整架构解析
网络·人工智能·架构·系统架构·信息与通信
爱笑的源码基地11 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415911 小时前
TCP超时重传机制是为了解决什么问题?
java