spring IOC控制反转及IOC实现的三种方式和bean标签使用

2023-10-27

spring  IOC控制反转及IOC实现的三种方式和bean标签使用


   IOC: 控制反转,简单的说是指对象的创建不再使用new,而是由spring框架创建。当服务器开始运行时,读取spring的主配置文件,经过spring框架从主配置文件中识别所有的bean标签,然后根据配置,将所有的对象创建出来。创建出来的对象保存在内存空间。
     
  IOC操作可以有三种实现方式
      1、使用默认构造方法创建对象
      2、静态工厂创建对象(关键在静态方法)
         自定义一个静态的工厂,通过工厂获取对象。
      3、实例工厂创建对象


下面演示的是IOC获取对象的三种方式:

项目中SpringTest.java测试类使用junit方式测试即单元测试。lib目录下为测试中需要的spring jar包,log4j.jar为日志包,User.java是测试需要的一个实体类,applicationContext.xml为spring的主配置文件,名称可以任意但官方建议使用该默认名称。MyFactory.java 为演示实例工厂方法创建对象的工厂类,StaticFcatory.java 为演示静态工厂方法创建对象的工厂类。log4j.properties为日志配置文件。本案例使用的spring版本为 spring4.3.9。

创建一个java项目,项目结构如下,:



代码如下:

1、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"  
    xsi:schemaLocation="  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  
    <!--通过框架常用IOC思想实现String对象的创建 -->  
    <!--bean标签实现对象的创建,IOC方式 -->  
  
    <bean id="str" class="java.lang.String"></bean>  
  
    <!--创建User对象 -->  
    <!--方式一:框架使用默认构造方法创建 -->  
    <bean id="user1" class="cn.sz.pojo.User"></bean>  
  
    <!--采用静态工厂的方式创建对象,简单的说就是一个静态的方法 -->  
    <!-- 方式二:静态工厂方法获取对象 -->  
    <bean id="c" class="java.util.Calendar" factory-method="getInstance"></bean>  
    <bean id="user2" class="cn.sz.factory.StaticFactory"  
        factory-method="getUser"></bean>  
  
  
    <!--方式三:采用实例工厂的方式创建对象 -->  
    <bean id="factory" class="cn.sz.factory.MyFactory"></bean>  
    <bean id="user3" class="cn.sz.pojo.User" factory-bean="factory"  
        scope="prototype"></bean>  
  
</beans>  



2、log4j.properties (日志文件)

log4j.rootLogger=DEBUG,console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.maxBackupIndex=100
##log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=c:/error1.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE.MaxFileSize=1MB



3、SpringTest.java (junit测试类)

package cn.sz.test;

import java.util.Calendar;

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

import cn.sz.pojo.User;

//测试ioc创建对象
public class SpringTest {
	@Test
	public void test1() {
		// 读取主配置文件
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 获取对象
		String str = context.getBean("str", String.class);
		System.out.println(str.hashCode());// 打印hash值
	}

	// 方式一:使用默认构造方法创建对象
	@Test
	public void test2() {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user1 = context.getBean("user1", User.class);
		System.out.println(user1.hashCode());// 打印hash值
	}

	@Test
	public void test3() {
		// 通过静态方法获取日历对象
		Calendar c1 = Calendar.getInstance();
		System.out.println(c1);// 打印内存地址
		System.out.println("---------------");

		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Calendar c2 = ac.getBean("c", Calendar.class);
		System.out.println(c2);// 打印内存地址
	}

	// 方式二:静态工厂方法创建对象
	@Test
	public void test4() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user2 = ac.getBean("user2", User.class);
		System.out.println(user2);// 打印内存地址
	}

	// 方式三:实例工厂方法创建对象
	@Test
	public void test5() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user3 = ac.getBean("user3", User.class);
		System.out.println(user3);// 打印内存地址
	}
}



4、User.java (用户实体类)

package cn.sz.pojo;

public class User {
	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}



5、MyFactory.java (实例工厂方法类)

package cn.sz.factory;

import cn.sz.pojo.User;

public class MyFactory {
	// 实例工厂方法获取User对象
	public User getUser() {
		return new User();
	}
}



6、StaticFactory.java (静态工厂方法类)

package cn.sz.factory;

import cn.sz.pojo.User;

public class StaticFactory {
	// 静态方法获取User对象
	public static User getUser() {

		return new User();
	}
}


补充内容:

配置文件中的id名称必须唯一,实体类User必须提供无参的构造方法

<bean id="user1" class="cn.sz.pojo.User"></bean>

getBean方法获取对象的第一个参数为在配置文件中对象你要创建的对象的id,第二个参数为该对象的类型对象

User user1 = context.getBean("user1", User.class);


bean标签比较常见的属性:
name: 针对struts中的引用名存在特殊符号的情况时id不能使用则可以使用name,但是现在已经不用.
id:   用于设置对象的引用名称
class: 用于设置类全名路径
scope : singleton(单例),prototype(多例),request,session
singleton设置对象是单例的
        prototype设置对象是多例的---在ssh架构针对action类对象常用设置
        request设置对象在request范围对象的管理之中
        session设置对象在session域对象管理之中


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring IOC控制反转及IOC实现的三种方式和bean标签使用 的相关文章

随机推荐

  • numba.cuda OpenCV 图像处理

    文章目录 一 什么是numba 二 代码实现 三 实验结果 一 什么是numba python numba numba cuda numba能够帮助python进行动态编译 JIT 通过借助numba cuda可以实现对GPU的动态编译 实
  • html设置鼠标移入移出样式,vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法...

    鼠标移入添加class样式 HTML HTML绑定事件 加入或者移出class为active 流量套餐 JS 这里除了active这个class需要动态添加或者减去 其他的皆是移入移出都需要的class methods changeActi
  • 网页前端(HTML)

    CSS 下拉菜单 使用 CSS 创建一个鼠标移动上去后显示下拉菜单的效果 基本下拉菜单 当鼠标移动到指定元素上时 会出现下拉菜单 HTML 部分 我们可以使用任何的 HTML 元素来打开下拉菜单 如 span 或 a span
  • 小程序和H5上传图片转成Base64格式

    小程序和H5上传图片转成Base64格式 文章目录 小程序和H5上传图片转成Base64格式 前言 一 Base64是什么 二 Base转换 小程序的转换 小程序使用getFileSystemManager来获取文件管理器 使用 fileM
  • springboot里结合layui对表格数据的一些记录

    js代码 var layui active reload function 处理人的选择 var handler handler input name handler checked val 获取选中的值 var systemNo var
  • OpenSSL中AES加密的用法

    OpenSSL中AES加密的用法 作者 游蓝海 原文链接 http blog csdn net you lan hai article details 50992719 转载请注明出处 使用API的时候 需要特别小心数据长度 我在初次使用的
  • 美学生用ChatGPT写论文被识破,导师:好到不符合我对学生的预期

    据央视网快看微博3月20日消息 北密歇根大学的教授奥曼在学生作业中发现了一篇关于世界宗教的 完美论文 这篇文章写得比大多数学生都要好 好到不符合我对学生的预期 他去问ChatGPT 这是你写的吗 ChatGPT回答 99 9 的概率是的 C
  • Vue项目运行报错:“TypeError: Cannot read properties of undefined (reading ‘$on‘)“

    报错原因 无法读取未定义的属性 on 解决方法 在main js加入代码 event Bus 用于无关系组件间的通信 Vue prototype bus new Vue 我是零基础自学的菜鸟 想把这里作为笔记记录 下来我在编程路上遇到的bu
  • 政企市场,「观望」AI大模型

    数据安全等 刚需 下 私有化成为政企市场的准入门槛 然而私有化下 行业模型局限性尚未可知 加之信创化等因素 厂商仍需取长补短 为政企客户提供全方位的解决方案 作者 斗斗 编辑 皮爷 出品 产业家 政企领域 似乎正在成为AI落地的又一标的 几
  • 持安-大连万达集团零信任项目入选中国信通院2023零信任优秀案例

    2023年8月25日 以 链接云端 可信而安 为主题的 2023首届SecGo云和软件安全大会 在京隆重召开 会上 中国信息通信研究院重磅揭晓了 安全守卫者计划 优秀案例评选结果 零信任办公安全技术创新企业持安科技 与用户大连万达集团联合申
  • jackson 包版本低导致java.lang.NoSuchMethodError

    1 起因 本地window10项目运行无误 发布项目到正式环境Liunx系统后编译打包部署都没有问题 但是验证一个双因子认证功能时就报错 2 我看到这个错误 就知道肯定是 Maven 依赖问题 要么是版本冲突 存在不同版本的 2 个相同依赖
  • vite与webpack区别

    vite与webpack区别 在浏览器支持 ES 模块之前 JavaScript 并没有提供的原生机制让开发者以模块化的方式进行开发 这也正是我们对 打包 这个概念熟悉的原因 使用工具抓取 处理并将我们的源码模块串联成可以在浏览器中运行的文
  • Xilinx 7 系列 serdes速度

    目录 一 各器件的速率 一 各器件的速率 High speed interfaces including Serial ATA Aurora 1G Ethernet PCI Express OBSAI CPRI EPON GPON Disp
  • 将图片通过高通滤波进行锐化处理_AI智能图片清晰放大神器强势来袭,简直无敌了[189期]...

    获取方式请查看文章底部 点击上方 知秋设计素材 点右上角 点选 设为星标 AI智能图片无损放大神器 MAC WIN AI智能图片锐化清晰神器 mac win AI智能图片无损放大神器 Topaz A I Gigapixel是一款非常实用的A
  • Jenkins在centos环境下连接gitee报错问题

    问题描述 在centos环境下jenkins配置gitee时测试连接出现无法连接ERROR问题 期初怀疑是加速镜像导致gitee插件失效问题 后来看了后台错误日志后发现在centos环境下缺失jar包 之前在windows环境下测试不会出现
  • buildroot教程

    什么是buildroot Buildroot是Linux平台上一个开源的嵌入式Linux系统自动构建框架 0 下载buildroot Buildroot版本每2个月 2月 5月 8月和11月发布一次 版本号的格式为YYYY MM 例如201
  • 【翻译】全新16英寸MacBook Pro评测:开发人员的梦想成真

    要问现在适合开发者用的笔记本 市面上还是有很多选择的 比如Dell的XPS系列 外星人系列 游戏也是杠杠滴 联想拯救者系列 还有形形色色的高配机型 价格也从几千到几万不等 但是 笔吧评测室的猪哥说过 从一万元开始 就已经难以用定位的方式来给
  • Mycat windows安装

    id iframe1033655 0 src http pos baidu com jcrm rtbid 2097325 rdid 9223372032564562618 dc 2 di 1033655 dri 0 dis 0 dai 1
  • 报错:JSONException: illegal identifier : \pos 1, line 1, column 2 或not close json text, token : error

    报错 JSONException illegal identifier pos 1 line 1 column 2 或JSONException not close json text token error 简述问题 处理 结果 简述问题
  • spring IOC控制反转及IOC实现的三种方式和bean标签使用

    spring IOC控制反转及IOC实现的三种方式和bean标签使用 IOC 控制反转 简单的说是指对象的创建不再使用new 而是由spring框架创建 当服务器开始运行时 读取spring的主配置文件 经过spring框架从主配置文件中识