Spring核心思想讲解之控制反转(IOC)

news2024/11/28 22:54:43

控制反转概述

控制反转实现方式

XML方式

方式一

方式二

方式三

 注解方式

第一步

第二步

第三步

依赖注入(DI)实现方式

XML方式

手动注入

set注入

构造器注入

自动注入

set注入

构造方法注入

注解方式

方式一:

方式二:


控制反转(IOC)是目的,而依赖注入(DI)是实现目的的方式。

控制反转概述

Spring 控制反转(Inversion of Control,IoC)是一种设计模式,它改变了传统的程序组件之间的依赖关系,使得系统不再由组件自身负责创建相互依赖的对象,而是将这个任务交给了外部容器,如Spring框架。在Spring中,通过配置文件或者注解的方式,开发者声明了组件间的依赖关系,然后Spring会在运行时根据这些信息自动管理对象的生命周期和依赖关系。

Spring IoC的核心就是BeanFactory和ApplicationContext,它们负责创建、初始化和管理应用中的bean(对象)。这种机制有助于降低代码耦合度,提高代码的灵活性和可测试性,并且支持模块化的开发和松散的耦合。

控制反转实现方式

XML方式

方式一

直接创建对象(根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败)

<bean id="accountService" class="com.xszx.service.impl.AccountServiceImpl"/> 

方式二

静态工厂创建对象,spring管理静态工厂-使用静态工厂的方法创建对象(了解)

//模拟一个静态工厂,创建业务层实现类 

public class StaticFactory { 

public static IAccountService createAccountService(){ 

return new AccountServiceImpl(); 

	} 

} 
//此种方式是: 

//使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器 

//id 属性:指定 bean 的 id,用于从容器中获取 

//class 属性:指定静态工厂的全限定类名 

//factory-method 属性:指定生产对象的静态方法 
<bean id="accountService"

class="com.xszx.factory.StaticFactory"

factory-method="createAccountService"></bean> 

方式三

 工厂模式创建对象(了解)spring 管理实例工厂-使用实例工厂的方法创建对象

<!-- 此种方式是: 

先把工厂的创建交给 spring 来管理。 

然后在使用工厂的 bean 来调用里面的方法 

factory-bean 属性:用于指定实例工厂 bean 的 id。 

factory-method 属性:用于指定实例工厂中创建对象的方法。 

--> //模拟一个实例工厂,创建业务层实现类 

//此工厂创建对象,必须现有工厂实例对象,再调用方法 

public class InstanceFactory { 

public IAccountService createAccountService(){ 

return new AccountServiceImpl(); 

	} 
} 
//此种方式是: 

//先把工厂的创建交给 spring 来管理。 

//然后在使用工厂的 bean 来调用里面的方法 

//factory-bean 属性:用于指定实例工厂 bean 的 id。 

//factory-method 属性:用于指定实例工厂中创建对象的方法。  

<bean id="instancFactory" class="com.xszx.factory.InstanceFactory"></bean> 

<bean id="accountService"

factory-bean="instancFactory"

factory-method="createAccountService"></bean>

 注解方式

第一步

在beans.xml中配置注解的命名空间(与context有关的三行代码)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

第二步

书写开启注解的代码

<!--开启注解-->
<context:annotation-config/>
<!--组件扫描-->
<context:component-scan base-package="com.xszx"></context:component-scan>

第三步

在指定需要控制反转的类上边标明注解即可

方式一:可以统一都标明@Component

方式二:控制器层@Controller

业务层@Service

数据层@Repository

依赖注入(DI)实现方式

XML方式

手动注入

set注入

set注入的name属性找的是对应set方法后面的名字

<!--      set方式注入  -->
    <bean id="userController" class="com.xszx.controller.UserController">
        <property name="userService" ref="userService"> </property>
    </bean>
构造器注入

构造器注入的name属性找的是形式参数列表的名字

 <!--  构造器方式注入-->
    <bean id="userController" class="com.xszx.controller.UserController">
        <constructor-arg name="userService" ref="userService"> </constructor-arg>
    </bean>

自动注入

set注入

(需要有无参构造方法)

byName注入

通过指定名称对应被注入方的set方法名称,可以有多个类型,但是需要有一个唯一的名字与之对应

  <!--      自动set方式byName注入  -->
    <bean id="userController" class="com.xszx.controller.UserController" autowire="byName">

    </bean>

byType注入

通过注入的类型来自动匹配相关的bean,但是需要提供唯一的一个类型bean。

 <!--      自动set方式byType注入  -->
    <bean id="userController" class="com.xszx.controller.UserController" autowire="byType">

    </bean>
构造方法注入

通过指定构造方法注入

 <!--      构造方法自动注入  -->
    <bean id="userController" class="com.xszx.controller.UserController" autowire="constructor">

    </bean>

注解方式

仍然需要配置注解的命名空间及开启注解,参考前面即可。

方式一:

在属性或者set方法上面标明@Autowired(默认按照byType)

@Autowired 如果出现两个以上的类型都能被注入,那么会报错:expected single matching bean but found 2: userServiceImpl,userServiceImpl02

解决办法:

可以通过名称来注入,如果需要指定名称注入,那么追加@Qualifier(value = "bbb")

方式二:

在属性或者set方法上面标明@Resource

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

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

相关文章

IO流【详解】

一、IO流 1.1 IO说明 Input 输入 Output 输出 流: 例如水流,流量,即流是指数据流动传输 IO流就是指数据的输入输出 例如: 将磁盘中的小说.txt,读取到java代码中 ---> 输入 例如: 从java代码中,写到磁盘中创建出文件,并向文件中写入内容 --> 输出 1.2 IO体系 IO 字节…

新手也能快速上手!免费的四款视频剪辑神器大揭秘

现在好用的剪辑工具好的的呀&#xff0c;只要有玩抖音、快手和一些视频为主的社交平台&#xff0c;大家都会尝试用一些剪辑工具自己动手剪辑&#xff0c;在近几年视频的热度之下这类工具做得也越来越专业了&#xff0c;当然其中也还是会有既专业又免费实用的产品&#xff0c;今…

教程:一步步教你构建基于Python Flask和Vue的智慧书析K-means分析系统

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并挂载1TB的exFAT格式的TF卡

fdisk -l df -h df -t df -T mount 20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并挂载1TB的exFAT格式的TF卡 2024/8/21 18:06 【切记&#xff0c;对于Rockchip原厂的Buildroot&#xff0c;如果你没有针对性的适配DTS&#xff1a;修改其中的GPIO口供电&#xff0c…

分析AAC raw data

分析AAC raw data 本文的主要目标是分析说明AAC解码器如何处理RAW AAC数据。通过拆解理解AAC解码器处理raw aac的关键点&#xff0c;通过数据分析和代码阅读&#xff0c;来说明这个细节&#xff0c;某些细微之处尚需深入探索&#xff0c;留待后续更为详尽的阐述。 几种格式介…

C语言 ——— 常见的动态内存错误(上篇)

对NULL指针的解引用操作 代码演示&#xff1a; int* ptr (int*)malloc(sizeof(int) * INT_MAX); *ptr 10; free(ptr); 代码解析&#xff1a; 使用 malloc 函数动态开辟 sizeof(int)*INT_MAX 这么多个字节的空间&#xff0c;而 INT_MAX 是整型类型的最大值&#xff0c;那么…

优化WAN流量:如何通过调整系统设置降低企业网络成本

一、症状与问题背景 当电脑显示空闲状态时&#xff0c;如果满足以下条件&#xff0c;第二拨号链接可能会意外激活&#xff1a; 您正在使用基于 Microsoft Windows 的计算机&#xff0c;该计算机连接到远程网络并且是 Active Directory 域服务 (AD DS) 域的成员。 您通过二级…

jpg怎么转换成pdf?6个简单方法,实现jpg转换成pdf

你是否也曾想将jpg图片转换为pdf格式文档呢&#xff1f;亦或者在处理文档或制作报告时&#xff0c;不知道怎么才能更快地将多张图片整合成一个pdf文件呢&#xff1f;如果你正在寻找简单快速的方法&#xff0c;又有哪些工具可以帮助您完成图片转pdf呢&#xff1f;别着急&#xf…

Windows服务器部署基于【若依管理系统】开发的项目

&#x1f3af;导读&#xff1a;本文档详述了基于前后端分离的若依系统&#xff08;版本3.8.8&#xff09;在Windows环境下从零开始的部署流程&#xff0c;包括JDK、Redis、MySQL等环境的搭建与配置。前端部署涉及Vue项目构建、图片优化及利用Nginx托管&#xff1b;而后端则涵盖…

猫咪掉毛严重如何清理?希喂,霍尼韦尔宠物空气净化器实测分享

随着养宠人群的增多&#xff0c;市场关注到铲屎官们的需要&#xff0c;带来了新的科技产品——宠物空气净化器。宠物空气净化器是在普通空气净化器基础上&#xff0c;调整服务对象&#xff0c;为吸附宠物毛发而设计的。不少消费者被它的功能所吸引&#xff0c;打算购入使用。然…

带你速通C语言——函数(11)

在 C 语言中&#xff0c;函数是组织代码的重要方式&#xff0c;它们允许我们将代码划分为可重用的模块&#xff0c;每个模块执行特定的任务。函数的使用有助于代码的清晰性和维护性&#xff0c;也是编写结构化程序的基本构建块之一。 1.函数的基本组成 在 C 中定义函数时&…

Agentic Security:一款针对LLM模型的模糊测试与安全检测工具

关于Agentic Security Agentic Security是一款针对LLM模型的模糊测试与安全检测工具&#xff0c;该工具可以帮助广大研究人员针对任意LLM执行全面的安全分析与测试。 请注意 Agentic Security 是作为安全扫描工具设计的&#xff0c;而不是万无一失的解决方案。它无法保证完全防…

八爪鱼现金流-034,实际使用,资产折线图

每个月发工资后&#xff0c;记账月报。 回顾资产折线图。 比较大的波动&#xff0c;一次是22年2月左右贷款买房。一次是24年8月宝宝出生。 孩子开销太大。呜呜呜。 话说&#xff0c;这个折线图&#xff0c;能不能加一个标签或者备注呢&#xff1f; 这个需求功能稍后我研究一…

【STM32 HAL库】寻迹小车 开环控制 状态机 TB6612+TCRT5000+HC-05

【STM32 HAL库】寻迹小车 开环控制 状态机 TB6612TCRT5000HC-05 前言硬件硬件准备模块说明主控 APM32F103VBT6核心板DC/DC降压模块TB6612电机驱动TCRT5000红外循迹模块HC-05蓝牙透传模块 代码逻辑宏观框架状态机 框架测试微观模块电机模块循迹模块蓝牙控制模块 前言 碎碎念一下…

keepalived安装-centos7

一、yum安装 1、安装Keepalived&#xff1a; yum install -y keepalived 2、启动Keepalived服务&#xff1a; systemctl start keepalived 3、设置Keepalived服务开机自启 systemctl enable keepalived 4、检查Keepalived服务状态&#xff1a; systemctl status keepal…

VAuditDemo常规漏洞

VAuditDemo常规漏洞 一、留言类功能漏洞 messageDetail.php - 存在数字型SQL注入&#xff0c;反射型XSS SQL注入 sqlwaf修改措施 反射型XSS messageSub.php search.php - 存在反射型xss 二、用户操作类漏洞 1、登录功能 logCheck.php - 空验证码绕过漏洞 2、编辑用户信息类 upd…

秘密指南!浮毛会危害人体健康吗?宠物空气净化器帮助解决危害

每当立秋一到&#xff0c;对于我这样的重度鼻炎患者而言&#xff0c;无疑是又一轮掉毛季的预警。家中猫咪的毛发仿佛永远扫不尽&#xff0c;皮屑也无处不在&#xff0c;让人头疼不已。好在&#xff0c;两年前我采纳了宠物医生的建议&#xff0c;用上了宠物空气净化器&#xff0…

Element-plus el-input 添加图标

案例图 根据官方文档来&#xff0c;我们需要先注册图标并应用到全局。 import { createApp } from "vue" import App from "./App.vue"const app createApp(App) //创建VUE对象import * as ElementPlusIconsVue from "element-plus/icons-vue"f…

竞争和冒险

竞争和冒险 文章目录 竞争和冒险总结 产生原因 数字电路中&#xff0c;信号传输与状态变换时都会有一定的延时。 在组合逻辑电路中&#xff0c;不同路径的输入信号变化传输到同一点门级电路时&#xff0c;在时间上有先有后&#xff0c;这种先后所形成的时间差称为竞争&#xf…

【方法】如何给ZIP压缩文件添加密码?

如果想要保护ZIP压缩文件不被他人随意打开&#xff0c;可以设置密码保护&#xff0c;那要如何设置呢&#xff1f;下面推荐两种方法&#xff0c;一起来看看吧&#xff01; 方法1&#xff1a; 如果想在压缩文件的时候&#xff0c;同时设置密码&#xff0c;可以使用WinRAR或者7-…