Spring之依赖注入

news2025/7/8 11:55:01

文章目录

  • 前言
  • 一、set注入
    • 1.1 UserDao类:
    • 1.2 UserService类:
    • 1.3 spring.xml配置文件:
    • 1.4 测试类:
    • 1.5 执行结果:
  • 二、构造方法注入
    • 2.1 UserDao
    • 2.2 UserService类:
    • 1.3 spring.xml配置文件:
    • 2.4 测试类:
    • 2.5 执行结果
  • 总结


前言

依赖注入:
依赖指的是对象和对象之间的关联关系
注入指的是一种数据传递行为,通过注入的行为来让对象和对象产生关系
依赖注入实现的两种方式:
set注入
构造方法注入


一、set注入

省略接口:

1.1 UserDao类:

package com.powernode.spring6.dao;

public class UserDao {
    public void insertUser(){
        System.out.println("执行插入语句");
    }
}

1.2 UserService类:

package com.powernode.spring6.service;

import com.powernode.spring6.dao.UserDao;

public class UserService {
    private UserDao userDao;

	//这个set方法非常重要
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    //set注入的话必须提供一个set方法
    //spring容器会调用这个set方法,来给userDao属性赋值
    public void saveUser(){
        userDao.insertUser();
    }
}

1.3 spring.xml配置文件:

想让spring调用对应的set方法,需要配置property标签
name属性的值:set方法的方法名去掉set后的一堆拿过来,第一个字母改为小写
ref的值:ref后面指定的是要注入的bean的id

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

    <bean id="userService" class="com.powernode.spring6.service.UserService">
        <!--想让spring调用对应的set方法,需要配置property标签-->
       <!--name属性的值:set方法的方法名去掉set后的一堆拿过来,第一个字母改为小写-->
        <property name="userDao" ref="userDao"></property>
    </bean>

1.4 测试类:

@Test
    public void testFirstSpringCode2(){
        //第一步:获取spring容器对象
        //ApplicationContext翻译为应用上下文。其实就是spring容器
        //ApplicationContext是一个接口
        //ClassPathXmlApplicationContext 专门从类路径当中加载spring配置文件的对象

        //解析spring配置文件 启动了spring容器 并且实例化所有的bean对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        //第二步:根据bean的id从spring容器中获取这个对象
        UserService userService = applicationContext.getBean("userService", UserService.class);
        userService.saveUser();
    }

1.5 执行结果:

在这里插入图片描述
执行成功!
set注入的核心实现原理:通过反射机制调用set方法来给属性赋值,让两个对象之间产生关系

二、构造方法注入

核心原理:通过构造方法来给属性赋值

2.1 UserDao

public class UserDao {

    public void insertUser(){
        System.out.println("执行插入语句");
    }
}

2.2 UserService类:

public class UserService {
    private UserDao userDao;
    //使用构造方法
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    //set注入的话必须提供一个set方法
    //spring容器会调用这个set方法,来给userDao属性赋值
    public void saveUser(){
        userDao.insertUser();
    }

1.3 spring.xml配置文件:

构造方法注入:
指定构造方法的第一个参数,下标是0
可以不使用index 也可以根据参数的名字来配置

   <bean id="userDao" class="com.powernode.spring6.dao.UserDao"></bean>
    <bean id="userService" class="com.powernode.spring6.service.UserService">
        <!--
            构造方法注入:
            指定构造方法的第一个参数,下标是0
        -->
        <constructor-arg index="0" ref="userDao"></constructor-arg>
    </bean>

2.4 测试类:

@Test
    public void testFirstSpringCode2(){
        //第一步:获取spring容器对象
        //ApplicationContext翻译为应用上下文。其实就是spring容器
        //ApplicationContext是一个接口
        //ClassPathXmlApplicationContext 专门从类路径当中加载spring配置文件的对象

        //解析spring配置文件 启动了spring容器 并且实例化所有的bean对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        //第二步:根据bean的id从spring容器中获取这个对象
        UserService userService = applicationContext.getBean("userService", UserService.class);
        userService.saveUser();
    }

2.5 执行结果

在这里插入图片描述
执行成功!


总结

set注入的核心实现原理:通过反射机制调用set方法来给属性赋值,让两个对象之间产生关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务改造过程中那些必须重视的问题

“微服务”近几年尤其火热&#xff0c;各大厂都在进行微服务化改造和微服务建设&#xff0c;想享受微服务化带来的好处以便对自己的系统进行改造。分布式实验室特约记者李鹏采访了广州轻阅科技系统架构师陈珙&#xff0c;就微服务与SOA的区别与联系、企业引入微服务会带来的问题…

Vue2:官方路由 Vue-Router 3.x

前端路由 前端路由&#xff1a;根据不同的url地址&#xff0c;页面上展示不同的内容&#xff08;根据url地址的不同分发到不同的组件。&#xff09; SPA 介绍 spa 是 single page application 简写&#xff0c;意思是单页面应用程序。Vue 适合开发 spa 类型的项目。 优点&…

Django 所带的用户auth_user的坑点,authenticate()校验一直为None,校验与创建所遇到的问题整理与解决

整理一下django中用户模块自定义model后登录的一些问题&#xff1a; 网上的报错解决不是万能方案&#xff0c;主要还是要自主分析原因&#xff0c;有的是有用但是导包之类的也要看清楚因为自己修改了所以有所变得&#xff0c;不自定义的话又不太好用。 在项目初期决定使用auth…

鸡卵白蛋白偶联脂多糖(OVA-LPS),麻黄多糖修饰卵白蛋白(PB-OVA)

产品名称&#xff1a;鸡卵白蛋白偶联脂多糖 英文名称&#xff1a;OVA-LPS 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 脂多糖&#xff08;Lipopolysacchar…

第四站:数组

目录 一、一维数组的创建和初始化 1.数组的创建 &#xff08;1&#xff09;基本定义&#xff0c;创建方式 &#xff08;2&#xff09;经典的错误标准的零分 2.数组的初始化 3.一维数组的使用 4.一维数组在内存中的存储 二、二维数组的创建和初始化 1.二维数组的创建 2…

SpringBoot SpringBoot 开发实用篇 2 配置高级 2.2 松散绑定

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇2 配置高级2.2 松散绑定2.2.1 问题引入2.2.2 松散绑定2.2.3 小结2 配…

MySQL学习笔记:模型2

序言 《MySQL45讲》 为什么表数据删除一半&#xff0c;表文件大小不变&#xff1f; 表数据既可以存在共享表空间里&#xff0c;也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的&#xff1a; 这个参数设置为 OFF 表示的是&#xff0c;表的数据放在系统共…

错字修改 | 布署1个中文文文本拼蟹纠错模型

内容一览&#xff1a;中文文本错误的种类之一为拼写错误&#xff0c;本篇文章为利用 BART 预训练方法实现中文文本纠错功能的模型部署教程。 关键词&#xff1a;BART 中文拼写纠错 NLP 本文首发自微信公众号&#xff1a;HyperAI超神经 中文文本错误3大障碍&#xff1a;拼写、语…

Chapter9.1:线性系统的状态空间分析与综合(上)

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选&#xff0c;仅包含部分经典习题&#xff0c;需要完整版习题答案请自行查找&#xff0c;本系列属于知识点巩固部分&#xff0c;搭配如下几个系列进行学习&#xff0c;可用于期末考试和考研复习。 自动控制原理(…

第六节.常用Linux命令—chmod修改目录权限,组管理,用户管理

第六节.常用Linux命令—chmod修改目录权限&#xff0c;组管理&#xff0c;用户管理 1. chmod&#xff1a;可以修改用户/文件/目录的权限 1).命令格式: chmod(代表增加权限)/-(代表减少权限) r(可读权限)w(可写权限)x(可执行权限) 文件名/目录名 2.组管理&#xff1a; 1).终端…

年产5000吨饼干食品加工厂的工艺设计

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1概述 1 1.2饼干的特点 1 1.2.1适宜大规模生产 1 1.2.2容易消化吸收 1 1.2.3食用方便 1 1.2.4营养价值高 2 1.3设计依据 2 1.4 设计范围 2 1.4.1 一般部分 2 1.4.2 重点部分 2 1.4.3 图纸 3 1.5设计指导思想 3 1.5.1 指导思想 3 1.5.…

org.activiti.validation.validator

org.activiti.validation.validator目录概述需求&#xff1a;设计思路实现思路分析1.ActivitiEventListenerValidator3.AssociationValidator4.validateAtLeastOneExecutable5.DataObjectValidator拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for im…

【信号和槽】

前言 信号和槽是QT界面框架的一个核心特性&#xff0c;其重要性和MFC的消息映射机制一样。只要用QT开发项目&#xff0c;就一定会用到&#xff0c;所以必须100%熟练掌握&#xff0c;烂熟于心。 0x0 需要理解的概念 信号&#xff1a;特定情况下被发射的事件。鼠标单击按钮&…

基于复合粒子群优化的模糊神经预测控制的研究(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

boot+mp搭建版本踩坑记录

最近项目搭建中遇到的一些问题,涉及到 mp 版本 swagger集成等 文章目录前言一、引入mp启动报错1 相关配置2 报错 如下3 解决方案二、引入swagger1 引入的pom2 报错如下:3 解决方案三. 项目启动自动打开swagger页面总结前言 由于使用高版本springboot 导致集成遇到的一些问题 一…

Spring Boot+Netty+Websocket实现后台向前端推送信息

Netty 是一个利用 Java 的高级网络的能力&#xff0c;隐藏其背后的复杂性而提供一个易于使用的API的客户端/服务器框架。 可能在此之前你没有接触过&#xff0c;不过不要担心&#xff0c;下面我们通过一个消息推送的例子来看一下netty是怎么使用的。 1.添加Maven依赖 <!--…

动态代理静态代理

一、使用背景 将目标类包裹起来&#xff0c;对目标类增加一个前置操作和一个后置操作&#xff0c;比如添加日志&#xff0c;在调用目标类前、调用目标后添加日志。 感觉静态代理与动态代理的核心思想&#xff0c;都是根据目标类&#xff0c;拿到目标实现的接口&#xff0c;和…

【软考】-- 操作系统(上)

目录&#xff1a;操作系统&#xff08;上&#xff09;第一节 操作系统概述&#x1f384;一、操作系统基本概念1️⃣操作系统的五大部分&#xff1a;&#x1f38b;二、操作系统的分类1️⃣批处理操作系统&#xff1a;2️⃣分时操作系统&#xff1a;3️⃣实时操作系统&#xff1a…

STC51单片机28——跑马灯

//使用P1口流水点亮8位LED #include<reg51.h> //包含单片机寄存器的头文件 /**************************************** 函数功能&#xff1a;延时一段时间 *****************************************/ void delay(void) { unsigned char i,j; for(i…

Jetpack Compose 重写TopAppBar 实现标题多行折叠

没有效果图一律当水贴处理 效果动图 前言 想用composes实现类似CSDN的文章详细页面的标题栏 上滑隐藏标题后标题栏显示标题 compose.material3下的TopAppBar不能嵌套滚动 MediumTopAppBar 便使用了MediumTopAppBar一开始用着没什么问题&#xff0c;但是标题字数多了&…