spring——IOC控制反转

2023-11-18

一.IOC简介

IOC inversion of controller(控制反转)
spring的控制反转:

  • 是一种设计思想。
  • 把对象的创建,初始化,销毁等工作交给spring ioc容器,由spring ioc容器控制对象的生命周期。

二.spring创建对象的三种方式

spring创建对象的三种方式参考

创建com.jp.domain包,存放JavaBean对象

package com.jp.domain;
public class Person {
	public String name;
	//无参构造
	public Person(){}
	//有参构造
	public Person(String name){this.name=name;}
	public void talk(){
		System.out.println("讲话...");
	}
}

applicationContext.xml,总的xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- applicationContext.xml文件是主文件 -->
	<!-- 导入applicationContext_helloworld.xml文件 -->
	<import resource="com/jp/applicationContext_helloworld.xml"/>
	<!-- 导入applicationContext_person.xml文件 -->
	<import resource="com/jp/domain/applicationContext_person.xml"/>
</beans>

1.无参构造

applicationContext_person.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 无参构造 -->
	<bean id="p" class="com.jp.domain.Person"></bean>
</beans>

测试类Demo.java

package com.jp.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo {
	//方式1:spring通过默认的构造函数创建对象
	@Test
	public void test1(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Object o = ac.getBean("p");
		Person p=(Person)o;
		System.out.println(p);
	}
}

2.静态工厂

创建工厂类,BeanFactory.java

package com.jp.domain;

public class BeanFactory {
	//静态工厂,不用创建对象,直接类名.方法使用
	public static Person getInstance(){
		return new Person();
	}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 静态工厂 -->
	<bean id="factory" class="com.jp.domain.BeanFactory" factory-method="getInstance"></bean>
</beans>

测试类Demo.java

package com.jp.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo {
	//方式2:spring通过静态工厂创建对象
	@Test
	public void test2(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Person p = (Person)ac.getBean("factory");
		System.out.println(p);
	}
}

3.实例工厂

创建工厂类,BeanFactory.java

package com.jp.domain;

public class BeanFactory {
	//实例化工厂,要先创建BeanFactory对象,才能调用这个方法
	public Person getInstance(){
		return new Person();
	}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 实例工厂 -->
	<!-- factory-bean要与上面的id值一样,下面的id值可以随便写 -->
	<bean id="factory" class="com.jp.domain.BeanFactory"></bean>
	<bean id="f" factory-bean="factory" factory-method="getInstance"></bean>
</beans>

测试类Demo.java

package com.jp.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo {
	//方式3:spring通过实例化工厂创建对象
	@Test
	public void test3(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		BeanFactory factory = (BeanFactory)ac.getBean("factory");
		System.out.println(factory);
		Person p =(Person)ac.getBean("f");
		System.out.println(p);
	}
}

三.Bean标签

1.bean标签的scope属性

Demo.java

package com.jp.scope;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.jp.domain.Person;

public class Demo {
	@Test
	public void test1(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Person p1 = (Person) ac.getBean("p");
		System.out.println(p1);
		Person p2 = (Person) ac.getBean("p");
		System.out.println(p2);
		Person p3 = (Person) ac.getBean("p");
		System.out.println(p3);
	}
}

①.singleton

单例,scope属性的默认值。代表在spring ioc容器中只创建一个bean实例,每次都调用这一个对象。当使用单例时,对象中的List集合等存储容器放在成员位置会有线程安全问题,但可以放到某个函数中,即局部位置。

applicationContext_scope.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="p" class="com.jp.domain.Person" scope="singleton"></bean>
</beans>

Demo.java的三个结果相同

②.prototype多例

多例,每次从spring ioc容器中获取时,都会返回一个新的bean实例。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="p" class="com.jp.domain.Person" scope="prototype"></bean>
</beans>

Demo.java的三个结果不相同

③.request

用在web开发中,将bean对象request.setAttribute()存储到request作用域中

④.session

用在web开发中,将bean对象session.setAttribute()存储到session作用域中

2.bean创建生命周期

①.创建对象

spring容器通过默认的构造函数创建对象

②.调用初始化方法

init-method=“init”

③.调用工程方法

talk()

④.调用销毁方法

estory-method=“destory”

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="person" class="com.jp.domain.Person" lazy-init="true" init-method="init" destroy-method="destroy"></bean>
</beans>
package com.jp.domain;

public class Person {
	public String name;
	public Person(){
		System.out.println("Person对象创建了...");
	}
	public Person(String name){
		this.name=name;
	}
	public void talk(){
		System.out.println("讲话...");
	}
	public void init(){
		System.out.println("初始化方法...");
	}
	public void destroy(){
		System.out.println("销毁方法...");
	}
}
package com.jp.life;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jp.domain.Person;

public class Demo {
	@Test
	public void test1(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Person p=(Person)ac.getBean("person");
		p.talk();
	}
}
  • lazy-init属性
    lazy-init="false"或者"default"或者不写
    spring容器一启动,对象就创建完毕(调用空的构造方法)
    lazy-init=“true”
    调用spring容器调用getBean方法时,对象才创建(调用空的构造方法)
  • init-method=“Person对象中的初始化方法名”;
  • destroy-method=“Person对象中的销毁方法名”;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring——IOC控制反转 的相关文章

  • 查看Windows以及linux操作系统的CPU核数、位数、内存大小

    win7系统开始 就分为64位和32位 什么位的操作系统一般是由用户的硬件配置决定 32位系统最大只能支持3 5GB内存 如果在32位系统中使用的是4GB或者更大容量内存 电脑只可以识别到3 4GB可用 而64位系统最大可以支持128GB大
  • 校园无线网络服务器,某校园无线网络覆盖设计方案.doc

    PAGE PAGE 43 无线局域网 技术建议书 2009年9月 目 录 TOC o 1 3 h z u HYPERLINK l Toc240424971 1概述 PAGEREF Toc240424971 h 3 HYPERLINK l T
  • 在jupyter中操作matplotlib的相关操作(一)

    一 什么是GUI 图形用户界面 Graphical User Interface 简称 GUI 又称图形用户接口 是指采用图形方式显示的计算机操作用户界面 二 今天学习了matplotlib工具的绘图功能 具体包括 导入matplotlib
  • 目标服务器无响应,Android:org.apache.http.NoHttpResponseException:目标服务器无法响应...

    我的Android应用使用HttpClient HttpGet来访问REST API 我也设定了 httpGet addHeader Authorization Basic basicAuth 将Base64编码的 用户名 密码 发送到服务
  • 推荐系统(四)——因果效应uplift model系列模型S-Learner,T-Learner,X-Learner

    在之前的文章中我们介绍了使用因果推断中的去除混杂和反事实的相关理论来纠正推荐系统中的偏差问题 在这篇文章中主要和大家分享uplift model相关知识和方法 例子 小夏的商铺在上次请了明星代言后 销量有所上升 但是他不清楚是不是每个人都对
  • uView实现全屏选项卡

    直接复制粘贴即可使用
  • spring boot + aop 自定义日志--收集操作日志

    背景 spring boot aop 自定义注解收集controller层日志 自定义注解 1 1 自定义注解 pom xml
  • 互联网公司级别的简单划分(小白总结)

    1 小公司10 20人 2 稍大的公司 外包公司 3 普通上市公司 有限责任公司 股份制公司 4 知名互联网独角兽 5 央企 工作稳定 6 国企 一线国企 全员分红 年终奖 非一线国企 比一线稍差 7 BAT 美团 字节跳动 京东 注意 x
  • Go(九)指针

    目录 Go语言中的指针 1 1 指针地址和指针类型 1 2 指针取值 1 3 new和make 1 3 1 new 1 3 2 make 1 3 3 new与make的区别 区别于C C 中的指针 Go语言中的指针不能进行偏移和运算 是安全
  • msys64安装使用

    msys64安装使用 下载工具 安装 修改软件下载源 添加工具 查找软件名并安装 更新数据库 测试 之前安装的msys64由于某些原因出现密钥无法更新等问题 各种方法都试了还是处理不了 算了浪费时间耽误事直接卸载掉了 重新安装 最近看到有解
  • python初学者学习第1天

    python环境安装 要想学习 门新的编程语 少不了安装各种各样的软件和配置各种各样的环境 为此 给学习python的同学准备了 份环境安装指南 一 python安装包下载 需要从python官网 https www python org
  • 认识MSCI ESG评级

    认识MSCI ESG评级 成为ESG领导者 ESG特辑 商道纵横 ESG 环境 社会和公司治理 简称ESG 投资理念逐渐成为国际资本市场中的主流投资策略 对于投资者而言 要充分掌握企业的ESG表现 评估企业的环境社会贡献 需要具有公允力的E
  • RabbitMQ 登录控制台出现 “你与此网站的连接不是私密连接“

    解决方案 可能是创建容器时 密码没能成功设置进去 重新设置密码 先进入MQ容器中 我这里是用的docker 容器 docker exec it mq容器名 bash 查看用户 rabbitmqctl list users 修改密码 rabb
  • Python内置数据类型之List篇

    List的定义 li one two three four List是一个有序的集合 这点不同于Dictionary Dictionary是无序的 1 索引和切片 索引有正负之分 正索引下标从0开始 负索引下标从 1开始 比如 gt gt
  • 区块链和传统数据库有什么区别?

    都说区块链就是一种数据库 那区块链和传统数据库到底有什么区别呢 传统数据库拥有与其记录相关的授的客户机可以更改放在统一服务器上的部分 通过演进 ace副本 无论客户端在什么时候使用他们的PC访问数据库 他们都将获得数据库部分的更新适应 对数
  • python二维数组列表输出格式化:对齐数据(实例)

    学习python过程中遇到的问题 在这里记录一下 下面是二维列表 数组 格式化输出的实例 注意 t 有加后会自动对齐 a 学生学号 高等数学 高等物理 高等化学 程序语言 英文六级 个人平均成绩 201 t65 t58 t75 t80 t8
  • python保留小数位的三种方法

    python保留小数位的三种方法 保留小数位是我们经常会碰到的问题 尤其是刷题过程中 那么在python中保留小数位的方法也非常多 但是笔者的原则就是什么简单用什么 因此这里介绍几种比较简单实用的保留小数位的方法 方法一 format函数
  • PhpStorm64修改内存后不能启动

    审查phpstorm bat 这个bat文件应该是监控程序运行 并输出错误日志用的 在末尾加上pause查看完整的运行周期 JAVA EXE ALL JVM ARGS cp CLASS PATH com intellij idea Main
  • javac 命令 javac 命令大全详解---推荐看

    javac 命令 javac 命令大全详解 温柔一刀的技术博客 51CTO博客 1 javac 命令 用法 javac
  • Java--集合知识再补充(Map集合)

    下面就是我整理的部分学习笔记 学无止境 加油 为方便对多个对象的操作 就对对象进行存储 集合就是存储对对象最常用的一种方式 数组长度是固定的 且可以存储基本数据类型 集合可变 集合只能存储对象 Collection 下有两个子接口 为Lis

随机推荐

  • 权限验证-JWT认证

    JWT 1 什么是JWT JSON Web Token 通过数字签名的方式 以JSON对象为载体 在不同的服务终端之间安全的传输信息 2 JWT有什么用 JWT最常见的场景就是授权认证 一旦用户登录 后续每个请求都将包含JWT 系统在每次处
  • CentOS7 - systemd服务及开启关闭服务命令

    RHEL CentOS 7 0中一个最主要的改变 就是切换到了systemd 它用于替代红帽企业版Linux前任版本中的SysV和Upstart 对系统和服务进行管理 systemd兼容SysV和Linux标准组的启动脚本 Systemd是
  • oracle date 和 timestamp区别

    在今天的工作中 学到了以下几个知识点 一 date和timestamp 的区别 date类型是Oracle常用的日期型变量 他的时间间隔是秒 两个日期型相减得到是两个时间的间隔 注意单位是 天 例如 查看一下当前距离伦敦奥运会开幕还有多长时
  • c++ multiple definition of 问题解决方法

    问题描述 有一个 h头文件 两个 cpp文件都引用了这个 h文件 在 h文件中声明了一些全局变量或函数 编译时报错 multiple definition of 原因 好像是由于多次包含 然后编译 cpp文件是重复 定义了 解决方法 1 使
  • Linux 通过RPM包安装 MySQL 8.0

    Linux平台上推荐使用RPM包来安装Mysql MySQL 提供了以下RPM包的下载地址 MySQL MySQL服务器 你需要该选项 除非你只想连接运行在另一台机器上的MySQL服务器 MySQL client MySQL 客户端程序 用
  • 一、安卓笔记(1)—Android Studio下的的APP目录结构

    一 Android Studio工程目录 1 gradle文件夹包含的是gradle工具的各个版本 不需要手动去填写 自动生成的 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具 它使用一种基
  • C#开发Windows窗体应用程序的步骤

    使用C 开发应用程序时 一般包括创建项目 界面设计 设置属性 编写程序代码 保存项目 程序运行等6个步骤 1 创建项目 在Visual Studio2017开发环境中选择 文件 新建 项目 菜单 弹出 新建项目 对话框 如图8 1所示 图8
  • Linux环境下Ubuntu系统中下载gvim及相关配置

    分享一下Linux环境下gvim的下载以及自己的相关配置 也方便自己以后重新进行虚拟机的相关配置时进行参考 相关代码带有简略注释 Ubuntu版本18 04 6 首先是下载 命令窗口打开位置无所谓 在命令行中输入以下代码 sudo apt
  • Qt信号槽-原理分析

    转载一篇关于Qt信号槽原理解析的文章 讲解的很详细 有的地方可能有点深度 不过还是能很大程度上的帮助理解信号槽原理 一 问题 moc预编译在干嘛 signals和slots关键字产生的理由 信号槽连接方式有什么区别 信号和槽函数有什么区别
  • 性能优化面试题

    目录 1 当修改一个数据时 不想整个页面都被重新渲染 只想要渲染变更数据的那一部分 怎么做 2 页面是否可以快速加载 3 是否允许用户快速开始与之交互 4 怎么让滚动和动画流畅 5 怎么图片优化 6 骨架屏 合理的loading 7 长列表
  • 30款建模软件

    从入门级3D建模软件到中级再到高级的3D建模软件 从小白到大师相信总有一款适合你 下面是小编为大家列出的30款建模软件以及介绍 供您大开眼界 Google Sketchup 一款极受欢迎并且易于使用的3D设计软件 根据创作过程 开发了一套设
  • 冒泡排序(java)——3种方法

    这里的冒泡是按照从小到大的顺序来的 思想 将相邻的元素两两比较 当一个元素大于右侧相邻的元素时 交换他们的位置 当一个元素小于右侧相邻的元素时 不做任何改变 一 第一种方法 public static void main String ar
  • Python字典出现重复的键,以最后出现的值为准

    Python3 6及之后 字典是有序的了 出现重复的键 以最后出现的值为准 test dict a 1 a 2 a 3 print test dict 输出 a 3
  • 使用easyExcel导出excel文件

    1 导入jar包
  • Android Studio下载、安装和配置+SDK+tools下载(无敌超级详细版本)

    下载 Anderson Studio是Google为Android提供的官方IDE工具 下载地址 http www android studio org 此处下载3 4 1版本 安装环境要求 其中JDK的最低版本是1 7 所以系统空闲内存至
  • 一个普通聊友质问腾讯客服的录音 过瘾哈

    http yumengluentan uueasy com read htm tid 146 html
  • 关于区块链几个证书的理解

    关于区块链几个证书的理解 FISCO BCOS 1 说明 在FISCO BCOS中 证书这个概念有许多的概念 会在环境与节点配置 部署 构链等步骤中反复出现 例如链证书 机构证书 节点证书和客户端证书等 如下对这些概念和关系进行一个适当的理
  • 使用 source insight 代码跳转时出现 symbol not found 问题

    P S 本篇博客是根据自己的经验来写的 如果大家有不同意见随时交流 1 使用 source insight 代码跳转功能时出现 symbol not found 问题一般是有三种可能 在你添加代码时没有选择 Add tree 选项 创建 p
  • 用Requests和正则表达式爬取猫眼电影(TOP100+最受期待榜)

    目标站点分析 目标站点 猫眼榜单TOP100 如下图 猫眼电影的翻页offset明显在URL中 所以只要搞定第一页的内容加上一个循环加上offset就可以爬取前100 流程框架 1 抓取单页内容 利用requests请求目标站点 得到单个网
  • spring——IOC控制反转

    IOC控制反转思想 一 IOC简介 二 spring创建对象的三种方式 1 无参构造 2 静态工厂 3 实例工厂 三 Bean标签 1 bean标签的scope属性 singleton prototype多例 request session