控制反转(IOC)——Spring第一个核心思想

server/2024/10/25 15:38:31/

控制反转概述

        控制反转(IoC)是一种将对象的创建、组装和管理交给容器或框架来实现的编程思想。它可以减低对象之间的耦合度,提高代码的灵活性和模块化。控制反转的一种常见形式是依赖注入(DI),即对象的依赖(需要的资源)由外部实体提供,而不是由对象本身创建。控制反转也可以通过事件驱动编程或模板方法模式来实现。

控制反转实现方式

xml方式

语法

<bean id="对象名称" class="需要创建类的全限定类名"/> 

bean标签详解

id:给对象在容器中提供一个唯一标识。用于获取对象。

class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

scope:指定对象的作用范围。

* singleton :默认值,单例的.

* prototype :多例的.

name:映射路径名称

factory-bean:工厂bean名称

factory-method:工厂方法

lazy-init:懒加载配置

* false :默认值,关闭懒加载.

* true :开启懒加载.

init-method:初始化方法

destroy-method:销毁方法

创建方式

第一种方式:使用默认无参构造函数
<!--在默认情况下: 
它会根据默认无参构造函数来创建类对象。如果 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 管理实例工厂-使用实例工厂的方法创建对象
/** 
* 模拟一个实例工厂,创建业务层实现类 
* 此工厂创建对象,必须现有工厂实例对象,再调用方法 
*/ 
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中追加配置

xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd<!--    开启注解驱动--><context:annotation-config/>
<!--    开启组件扫描--><context:component-scan base-package="com.xszx"></context:component-scan>

第一套注解(通用注解)

//等同于<bean id="userController" class="com.xszx.controller.UserController"></bean>
//如果需要指定名称,则使用@Component(value="aaa")
@Component
public class UserController{}

第二套注解(个性化注解)

@Controller
public class UserController {}
@Service
public class UserServiceImpl implements UserService {}
@Repository
public class UserDaoImpl implements UserDao {}

依赖注入实现方式

        依赖注入(Dependency Injection,DI)是一种设计模式,它通过将对象之间的依赖关系的创建和维护转移到外部容器中来,以减少对象之间的紧耦合性并提高可重用性。在传统的程序设计中,对象通常通过直接创建和维护依赖关系来使用其他对象,这会导致对象之间的紧耦合性,使代码难以维护和扩展。然而,依赖注入模式将对象之间的依赖关系的创建和维护转移到外部容器中,使得对象之间的耦合性降低,并且可以方便地更改依赖项的实现类,而无需修改受影响的对象的代码。

        依赖注入通常有两种方式:设值注入和构造注入。设值注入是通过客户端类的公共属性或setter方法提供依赖性。构造注入则是通过在客户端类的构造函数中传递依赖项来实现。在Spring框架中,依赖注入是其核心特性之一,它通过Spring容器来管理对象的生命周期和依赖关系,从而实现解耦和灵活的配置。

        总的来说,依赖注入是一种有效的设计模式,它能够帮助开发者降低代码之间的耦合性,提高代码的可重用性和可维护性,是构建高质量软件的重要工具之一。

XML方式

手动注入

Set方法注入
java"><!--property:set方法注入
name:(需要寻找被注入方的set方法)set+name名称的首字母大写
ref:需要引用的bean标签id名称
value:简单的属性值-->
<bean id="userController" class="com.xszx.controller.UserController"><property name="userService" ref="userService"></property><property name="age" value="12"></property>
</bean>
构造方法注入
java"><!--constructor-arg:构造方法注入
name:构造方法中的形参名称
ref:需要引用的bean标签id名称
value:简单的属性值
-->
<bean id="userController" class="com.xszx.controller.UserController"><constructor-arg name="age" value="12"></constructor-arg><constructor-arg name="userService" ref="userService"></constructor-arg>
</bean>

自动注入

Set方法注入
byName注入

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

java"><bean id="userController" class="com.xszx.controller.UserController" autowire="byName"></bean>
byType注入

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

java"><bean id="userController" class="com.xszx.controller.UserController" autowire="byType"></bean>
构造方法注入

        通过指定构造方法注入

java"><bean id="userController" class="com.xszx.controller.UserController" autowire="constructor"></bean>

注解方式

beans.xml中追加配置

java">xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd<!--    开启注解驱动--><context:annotation-config/>
<!--    开启组件扫描--><context:component-scan base-package="com.xszx"></context:component-scan>
第一套注解
java">//set方法上标注注解
//默认按照类型注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
第二套注解
java">//默认是按照byName方式注入,如果没有匹配则通过byType注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
//@Resource还有两个重要的属性:name和type,用来显式指定byName和byType方式注入
@Resourcepublic void setUserService(UserService userService) {this.userService = userService;}

 求赞求赞,关注一下我吧,各位大官人!!!给大家磕一个!!!


http://www.ppmy.cn/server/104508.html

相关文章

【Kotlin设计模式】Kotlin实现工厂模式

前言 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;提供一个创建对象的接口&#xff0c;不暴露对象的创建过程。它将实例化对象的任务交给子类或具体实现&#xff0c;从而使得客户端代码与具体类解耦。 工厂模式主要分为以下三类&#xf…

【通俗易懂】一篇文章带你了解Redis的过期策略与内存淘汰策略

目录 一、过期策略 二、内存淘汰策略 2.1 介绍 2.2 如何选择&#xff1f; 一、过期策略 Redis 通过设置过期时间来控制键值对的生命周期。过期时间可以通过EXPIRE、EXPIREAT、PERSIST等命令设置&#xff0c;也可以在插入数据时直接设置过期时间。 Redis 的过期策略采用的…

交直流充电桩检测的核心功能

交直流充电桩检测的核心功能主要包括以下几个方面&#xff1a; 1. 充电状态监测&#xff1a;充电桩检测系统需要实时监测充电设备的运行状态&#xff0c;包括充电电流、电压、功率等参数。通过对这些参数的实时监测&#xff0c;可以确保充电过程的安全和稳定。同时&#xff0c…

密码管理系统的自动化与集成:重塑安全与效率的双重飞跃

在数字化时代&#xff0c;密码作为保护个人信息、企业资产及敏感数据的第一道防线&#xff0c;其重要性不言而喻。然而&#xff0c;随着网络应用的激增和复杂性的提升&#xff0c;传统的密码管理方式——如使用简单密码、重复密码或依赖记忆——已难以满足现代安全需求&#xf…

2024/08(二) 近期关于AI的阅读和理解[笔记]

## Multi Agent/Flow 最近团队在实验 flowise 的 Agentflows 设计&#xff0c;顺带看了现在市面多加解决方案&#xff0c;这两天偶尔看到蚂蚁CodeFuse团队开发的Mulit Agent框架开发思想&#xff0c; 所以将他们一起总结归纳下。 Agent Base&#xff1a;构建了四种基本的Agent…

AutoGPT开源项目解读

AutoGPT开源项目解读 (qq.com) AutoGPT旨在创建一个自动化的自我改进系统&#xff0c;能够自主执行和学习各种任务 项目基本信息 首先阅读项目的README.md&#xff0c;下述代理和智能体两个名词可互换 项目简介&#xff1a;一个创建和运行智能体的工具&#xff0c;这些智能体…

C# 二维数组和嵌套数组

文章目录 1.二维数组2.嵌套数组 1.二维数组 数组必须等长 int[,] a new int[2, 4] { 1, 2, 3, 4,5, 6, 7, 8, } ; Console.WriteLine(a[0, 0]); // 12.嵌套数组 数组无须等长 int[][] b new int[][] {new int { 1, 2, 3, 4 },new int { 5, 6 } } Console.WriteLine(b[0]…

Python实战:如何使用K-means算法进行餐馆满意度NLP情感分析

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