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

控制反转概述

控制反转实现方式

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.mfbz.cn/a/871448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用excel内容批量建立文件夹

建文件夹是电脑操作过程中比较常见的&#xff0c;但是用EXCEL内容批量建文件夹&#xff0c;这似乎不相关的两个操作&#xff0c;那么怎么实现这样的一个功能&#xff0c;我们需要用到专门的软件进行关联&#xff0c;推荐&#xff1a;可易文件夹批量生成器&#xff0c;这个软件有…

RCE编码绕过--php://filter妙用

目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;&#xff0c;代码没有办法执行下去&#xff0c;所以…

Linux驱动学习之点灯(四,linux2.6)

上篇最后的第二种点灯方法年代比较久远&#xff0c;register_chrdev&#xff08;&#xff09;这个函数一下申请了255个设备号&#xff0c;不建议使用 如下图 下图的函数在linux2.6里是上图函数的升级版&#xff0c;不过他是静态分配&#xff0c;后续还得添加到cdev里 从上图函…

【自动驾驶】控制算法(三)轮胎侧偏与车辆动力学模型

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

回收站的文件删除了怎么恢复?4个技巧轻松找回文件!

在日常使用电脑的过程中&#xff0c;回收站作为我们删除文件的临时存放地&#xff0c;扮演着重要的角色。然而&#xff0c;有时我们可能会不小心从回收站中删除了重要文件&#xff0c;导致数据丢失。面对这种情况&#xff0c;许多用户会感到焦虑和无助。但别担心&#xff0c;本…

白酒与素食:健康与美味的双重享受

在美食的世界里&#xff0c;白酒与素食的搭配仿佛是一场跨界的盛宴。豪迈白酒&#xff08;HOMANLISM&#xff09;的醇香与精致素食的清新&#xff0c;在不经意间交织出了一幅美妙的画卷&#xff0c;让人在品味中感受到健康与美味的双重享受。 素食&#xff0c;以其清淡、自然的…

CORS error 302 Found

CORS error && 302 Found 场景 单点登录认证&#xff1a;访问A系统&#xff0c;在B系统登录认证 此处代码为A系统 controller ResponseBodyGetMapping("/idp/loginCheck")public void loginCheck(HttpServletRequest request, HttpServletResponse httpR…

使用 nginx 搭建代理服务器(正向代理 https 网站)指南

写在前面 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 文章目录 简介正向代理 简介ngx_http_proxy_connect_module 介绍 详细步骤包准备Linux 编译并安装 nginx修改 nginx 配置文件ngin…

【实现100个unity特效之24】使用ShaderGraph将图片转变为像素艺术

ShaderGraph连线图 效果 参考 https://www.youtube.com/watch?vBmhj7RgVDzc 完结 赠人玫瑰&#xff0c;手有余香&#xff01;如果文章内容对你有所帮助&#xff0c;请不要吝啬你的点赞评论和关注&#xff0c;你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章…

Postgres 超时 (Timeout) 详解

原文地址 https://www.bytebase.com/blog/postgres-timeout/ PostgreSQL 提供各种超时 (Timeout) 设置&#xff0c;通过控制某些进程的持续时间来帮助管理和优化数据库操作。这些超时对于确保系统的稳定性和性能至关重要&#xff0c;尤其是在高流量或复杂查询的环境中。让我们…

学习大数据DAY42 hive 分桶表

目录 分桶表 分桶表注意事项 hive 分桶表-创建分桶表 hive 排序关键字 hive 排序语句 上机练习 分桶表 分区提供一个隔离数据和优化查询的便利方式。不过&#xff0c;并非所有的数据集都可形 成合理的分区。对于一张表或者分区&#xff0c;Hive 可以进一步组织成桶&…

API容易被攻击,如何做好API安全

随着互联网技术的飞速发展和普及&#xff0c;网络安全问题日益严峻&#xff0c;API&#xff08;应用程序接口&#xff09;已成为网络攻击的常见载体之一。API作为不同系统之间数据传输的桥梁&#xff0c;其安全性直接影响到整个系统的稳定性和数据的安全性。 根据Imperva发布的…

【区块链+商贸零售】消费券 2.0 应用方案 | FISCO BCOS应用案例

方案基于FISCO BCOS区块链技术与中间件平台WeBASE&#xff0c;实现新一代消费券安全精准高效发放&#xff0c;实现消费激励&#xff0c; 促进消费循环。同时&#xff0c;方案将用户消费数据上链&#xff0c;实现账本记录与管理&#xff0c;同时加密机制保证了数据安全性。

【解决】Python | ModuleNotFoundError: No module named codecs

【解决】Python | ModuleNotFoundError: No module named codecs 在Python开发中&#xff0c;ModuleNotFoundError: No module named codecs 是一个相对罕见的错误&#xff0c;因为 codecs 是Python标准库中的一个模块&#xff0c;通常应该总是可用的。然而&#xff0c;当你遇到…

【kubernetes】k8s配置资源管理

一、ConfigMap资源配置 ConfigMap保存的是不需要加密配置的信息 ConfigMap 功能在 Kubernetes1.2 版本中引入&#xff0c;许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制&#xff0c;ConfigMap 可以被…

avue-crud 自定义搜索项 插槽

加上 -search 就可以自定义查询项了

43.x86游戏实战-XXX寻找吸怪坐标

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

如何在 FastReport .NET 中构建和安装 Postgres 插件

FastReport .NET 是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案。 功能非常丰富&#xff0c;功能广泛。今天我们将介绍如何使用报表设计器的 FastReport 插件连接数据库。 FastReport .NET 是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体…

SQL注入(cookie、base64、dnslog外带、搜索型注入)

目录 COOKIE注入 BASE64注入 DNSLOG注入—注入判断 什么是泛解析&#xff1f; UNC路径 网上邻居 LOAD_FILE函数 搜索型注入—注入判断 本文所使用的sql注入靶场为sqli-labs-master&#xff0c;靶场资源文件已上传&#xff0c;如有需要请前往主页或以下链接下载 信安必备…

视频直播平台选择服务器需要注意什么?

在当今数字化时代&#xff0c;直播平台已成为连接内容创作者与广大观众的重要桥梁。为了确保直播的流畅性、稳定性和安全性&#xff0c;服务器的选择与配置显得尤为重要。以下是搭建直播平台时&#xff0c;服务器所需具备的关键因素。 一、高性能与可扩展性 直播平台需要处理大…