[Spring]第二篇:IOC控制反转

news2024/10/7 18:26:24

简单的说就是,创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转.

  1. spring创建对象时,会读取配置文件,配置文件中主要配置接口和实现类的关系,每个接口对相应一个实现类,使用<bean>标签配置,<bean中的id可以随便起,但为了见名知意,一般使用接口名首字母小写,class指向实现类的全限定名,也就是加上包名>)中的信息,然后使用反射给我们创建好对象
  2. 创建好之后在容器(这个容器里放的是map集合,key为接口id,value为所对应的实现类)中存储起来,当我们需要某个对象时,通过id(集合的key)获取对象即可,不需要我们自己去new.如果要使用别的实现类,只需要在配置文件中修改实现类的路径名,不用修改代码

一句话:创建对象交给容器,用的时候再去容器中取

Spring解耦合的原理
图解:

一.简单使用IOC 

 1.创建maven项目,设置maven
先创建一个空项目

2.名字可以是spring_all

 在项目下创建模块 名字可以是spring_test_01

 

 3.pom.xml中导入spring依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.3.5</version>
        </dependency>
    </dependencies>

四个依赖介绍

  • spring-context      上下文,容器
  • spring-beans         创建对象
  • spring-core            核心jar
  • spring-expression 表达式jar

但是事实上,我们导入spring-context的时候,会自动导入其他依赖的jar,自动进行了依赖传递
所以,导入一个spring-context 依赖也可以

4.为了方便测试,我们导入Junit测试依赖

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>

5.在项目中定义一个接口和实现类,接口中定义一个方法并在实现类中实现接口

EmpDao接口和实现类

 6.在spring配置容器中的对象,创建spring配置文件, 文件名没有明确要求,暂时可以叫spring

 

7.在spring.xml中配置一个需要由容器初始化的对象

 8.测试通过容器获取对象

 二.IOC底层原理和实现步骤

1 XML解析技术读取配置文件

<bean id="empDao" class="com.msb.dao.impl.EmpDaoImpl"></bean>

将上面的信息读取进入程序  对象的ID ,一个是对象的类的全路径名

2 反射技术实例化对象,放到容器中

  1. 获得类的字节码:Class clazz =Class.forName("com.msb.dao.impl.EmpDaoImpl")
  2. 通过字节码实例化对象:Object obj  = clazz.newInstance();
  3. 将对象放到一个map集合中:map.put("empDao",obj)

3工厂模式返回Bean对象

使用getBean方法,getBena方法是BeanFactory 父接口下的一个方法,但一般我们使用ApplicationContext 接口去调用这个方法
               

  public Object getBean(String name){
        Object obj =map.get(name);
        return obj;
  } 

IOC接口有两个

  1.  BeanFactory  接口: IOC容器基本功能接口,是spring内部使用的接口,我们在处理业务时一般不直接使用该接口
  2.   ApplicationContext 接口: BeanFactory的子接口,提供更多更强大的功能,研发人员一般使用的接口

接口下的实现类

三 Spring中的Bean管理(面试常问)

spring中的Bean的管理:
Bean(汉译咖啡豆). 又称JAVABean.其实就是JAVA程序程序中的一个个对象,所以Bean的管理其实就是spring对于JAVA程序中的对象的管理

管理的内容是什么:

管理了两部分,第一部分是对象的创建  也就是我们所说的 IOC,第二部分是属性的赋值  也就是我们所说的 DI, 先创建完属性才能赋值

1 对象的创建   IOC
IOC   叫做控制反转,就是Spring给我们创建对象,然后我们直接用,不用自己NEW,前面已经解释过
IOC处理的是对象如何创建的问题

2 属性的赋值   DI
DI   :(Dependency Injection),即“依赖注入” 就是创建属性时给对象属性赋值
对象功能的实现往往要依赖属性的值,那么给对象属性赋值就可以说成是依赖注入
由于对象属性不仅仅是基本数据类型,还可能是其他类,或者引用类型
那么依赖注入将会把更多的对象之间的关系整理到一起,可以行程一个庞大的依赖关系
DI处理的是对象的属性赋值和互相依赖的关系
3.spring给我们提供了两种关于bean的方式

1 基于XML方式的Bean管理

2 基于注解方式的Bean管理

四 测试基于XML方式的Bean管理

1.创建新的模块并导入以下依赖

 

依赖

       

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>

2.创建spring配置文件,一般spring的配置文件很多人约定俗称为application****.xml

 

3.准备一个要实例化的类

public class User {
    private Integer userid;
    private String username;
    private String password;
    @Override
    public String toString() {
        return "User{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
    public User() {
        System.out.println("noArgConstructor");
    }
    public User(Integer userid, String username, String password) {
        System.out.println("allArgConstructor");
        this.userid = userid;
        this.username = username;
        this.password = password;
    }
    public void setUserid(Integer userid) {
        System.out.println("setUserid");
        this.userid = userid;
    }
    public void setUsername(String username) {
        System.out.println("setUsername");
        this.username = username;
    }
    public void setPassword(String password) {
        System.out.println("setpassword");
        this.password = password;
    }
}

4.IOC创建对象:通过无参构造方法构造对象

 <bean id="user1" class="com.msb.bean.User"></bean>

<bean> 标签的常见属性

 <bean id="user1" class="com.msb.bean.User" name="user1" scope="prototype" lazy-init="true" ></bean>

  • id    对象的id
  • class 类的全路径名
  • name 和id类似,一般不用
  • scope 控制对象单例多例和使用范围   ,包含以下5个属性
  1.   singleton作用域(scope 默认值), Spring IOC容器中只会存在一个共享的bean实例
  2.   prototype作用域部署的bean,每一次获取都会产生一个新的bean实例,相当与一个new的操作
  3.     request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
  4.     session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
  5.     global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义
  • lazy-init 懒加载 调用getBean的时候再去实例化对象

以上主要是SpringIOC的IOC内容,后续会持续更新DI部分,以及AOP部分

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

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

相关文章

微软S2C2F框架已被OpenSSF开源安全体系采用

近日&#xff0c;微软发布“安全供应链消费框架(Secure Supply Chain Consumption Framework&#xff0c;简称S2C2F)”1.1版本。该框架已被OpenSSF供应链完整性工作组采用。至此&#xff0c;OpenSSF开源软件评价相关的项目和指南已覆盖使用安全、关键性、基础设施安全、漏洞披露…

机器人导航必备的栅格地图数学模型及使用

机器人导航必备的栅格地图数学模型及使用占据栅格地图&#xff08;Occupancy Grid Map&#xff09;占用栅格地图基础概念占据栅格地图的数学模型ROS中使用OccupancyGrid占据栅格地图&#xff08;Occupancy Grid Map&#xff09; 占用栅格地图基础概念 上图就是一个ROS中的占据…

复旦大学-华盛顿大学EMBA项目位列全球第9,学术研究连续3年亚洲第一

2022年10月17日&#xff0c;英国《金融时报》&#xff08;FT&#xff09;发布全球EMBA项目排名&#xff0c;复旦大学-华盛顿大学EMBA项目位列全球第9位&#xff0c;学术研究连续3年亚洲第一&#xff0c;毕业生薪酬水平全球第六。    复旦大学-华盛顿大学EMBA项目是中国大陆…

JavaWeb三大组件之Filter

目录 1、Filter概述 2、Filter快速入门 2.1、开发步骤 2.2、代码演示 3、Filter执行流程​编辑 4、Filter拦截路径 5、过滤器链 5.1、概述 5.2、代码演示 5.3、问题 6、案例 6.1、需求 6.2、分析 6.3、代码实现 6.3.1、创建Filter 6.3.2、编写逻辑代码 6.3.3、…

SuperMap GIS管线数据处理QA

一、数据简介 传统的以二维平面展现网络数据的方式&#xff0c;在一定程度上限制了信息的表达&#xff0c;尤其是在复杂的空间位置关系上。三维网络是对现实中的网络的真实模拟&#xff0c;而非抽象模拟&#xff0c;因此能够全方位的展现信息。   例如&#xff0c;多层结构的…

python期末复习案例

一.条件判断 1. 判断一个数能否同时被3和7整除 and 两者都要为真 2.判断一个数能同时被3或者7整除 但不能同时被3和7整除 ★要使用not 3.输入年份&#xff0c;看是否为闰年 闰年条件&#xff1a;能被4整除但不能被100整除&#xff0c;或者能被四百整除 定义两个变量 保存一个…

leetcode 464. 我能赢吗 官方代码的一步步演进

这里写自定义目录标题题目示例解题优化1 记忆化搜索优化2&#xff1a;使用二进制代替choosable_list计算复杂性题目 在 “100 game” 这个游戏中&#xff0c;两名玩家轮流选择从 1 到 10 的任意整数&#xff0c;累计整数和&#xff0c;先使得累计整数和 达到或超过 100 的玩家…

Kafka - 09 Kafka副本 | Leader选举流程 | Follower故障 | Leader故障

文章目录1. 副本基本信息2. Leader选举流程3. Follower故障4. Leader故障1. 副本基本信息 1&#xff09;Kafka 副本作用&#xff1a;提高数据可靠性。 2&#xff09;Kafka 默认副本 1 个&#xff0c;生产环境一般配置为 2 个&#xff0c;保证数据可靠性&#xff1b;太多副本会…

深度学习网络模型——DenseNet模型详解与代码复现

深度学习网络模型——DenseNet模型详解与代码复现1、DenseNet概述2、DenseNet网络结构1、DenseNet中的DenseBlock模块2、DenseNet中的Transition模块3、DenseNet网络结构参数设置4、实验结果对比1、DenseNet概述 2、DenseNet网络结构 1、DenseNet中的DenseBlock模块 2、DenseNe…

内网穿透:针对小白的VSCode+云服务器+本地Ubuntu搭建GPU云服务器

前言 自己实验室的情况&#xff1a; 实验室拥有自己的GPU集群、工作站使用仅限于线下或者远程向日葵(不稳定、速度慢)拥有自己的廉价cpu轻量云服务器&#xff08;阿里云服务器(2G2*cpu)&#xff0c;大概40左右一年&#xff09; 平时出差、在宿舍等需要远程操作&#xff0c;向…

Python学习笔记-数字类型

目录 1. 数字类型 1.1 整型 1.2 浮点数 1.3 复数 1.4 布尔类型 2. 常用内置数值计算函数库 3. 随机数函数 本文记录python中的基本数字类型信息&#xff0c;以及一些其他的相关知识点。 1. 数字类型 python中用于标识数字或者数值的数据类型&#xff0c;主要有如下分类…

​鸽群卫星(Flock)​介绍

鸽群卫星&#xff08;Flock&#xff09;是美国Planet公司[1]研制的3U遥感立方体卫星星座&#xff0c;单颗卫星重约5kg&#xff0c;也被称为“鸽子”&#xff08;Dove&#xff09;。鸽群星座主要有两类轨道&#xff1a;空际空间站释放420km高、52度倾角轨道&#xff08;ISS&…

R语言基于决策树的银行信贷风险预警模型

引言 我国经济高速发展&#xff0c;个人信贷业务也随着快速发展&#xff0c;而个人信贷业务对提高内需&#xff0c;促进消费也有拉动作用。有正必有反&#xff0c;在个人信贷业务规模不断扩大的同时&#xff0c;信贷的违约等风险问题也日益突出&#xff0c;一定程度上制约着我…

力扣(LeetCode)115. 不同的子序列(C++)

动态规划 状态转移方程 f[i,j]{f[i−1,j]f[i−1,j]f[i−1,j−1]if s[i]t[j]f[i,j]\begin{cases} f[i-1,j]\\ f[i-1,j]f[i-1,j-1]&\text{if } s[i]t[j] \end{cases}f[i,j]{f[i−1,j]f[i−1,j]f[i−1,j−1]​if s[i]t[j]​ 无论选不选 s[i]s[i]s[i] &#xff0c; f[i][j]f[i…

解决报错:fatal: in unpopulated submodule *

目录 问题 解决 问题 今天想把两个 Git 工程合并成一个工程&#xff0c;尽管已经将其中一个工程的 .git 目录删除了&#xff0c;但是在合并提交时还是遇到了一个和子模块相关的报错&#xff0c;具体报错信息如下&#xff1a; fatal: in unpopulated submodule * 报错截图如下…

【iMessage苹果相册日历推位置推送】软件安装deviceToken是由APNs生成的

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

SpringBoot+html+vue模板开发

除了对某个表基本的增删改查以外&#xff0c;可能需要额外的增加操作&#xff0c;这里是通过按钮来实现的 1、新增一个测试按钮 <el-button type"primary" class"butT" click"test()">测试</el-button> 2、这个按钮绑定一个方法t…

Android 创建桌面组件Widget——构建应用微件(二)

Android 创建桌面组件Widget——构建应用微件&#xff08;二&#xff09;Android 创建桌面组件Widget——构建应用微件&#xff08;二&#xff09;概览使用 AppWidgetProvider 类接收应用微件广播 Intent固定应用微件设置预览图片完整代码Android 创建桌面组件Widget——构建应…

Spark学习(7)-SparkSQL函数定义

1 SparkSQL 定义UDF函数 目前在SparkSQL中&#xff0c;仅仅支持UDF和UDAF函数&#xff0c;python仅支持UDF。 1.1 定义方式 定义方式有两种&#xff1a; sparksession.udf.register() 注册的UDF可以用于DSL和SQL&#xff0c;返回值用于DSL风格&#xff0c;传参内的名字用于SQ…

如何在Odoo中添加水印?

为了防止信息的泄露&#xff0c;水印作为一种防泄密的方式&#xff0c;被使用的频率越来越高。 那么在Odoo中&#xff0c;如何添加水印呢&#xff1f;其实添加的方法有很多&#xff0c;如利用svg生成背景图&#xff0c;重复的dom元素覆盖等等。 本文主要讲解利用canvas输出背…