Spring 6【BeanFactory代码演示、实例化Bean的两种方式】(三)-全面详解(学习总结---从入门到深化)

news2024/11/29 0:37:33

目录

六、BeanFactory代码演示

 七、实例化Bean的两种方式


六、BeanFactory代码演示

上面的案例代码就是我们平时使用Spring Framework的代码。

为了让小伙伴们能感受到BeanFactory,我们还是用实际代码来进行演示一下。毕竟 ApplicationContext在牛,对于BeanFactory来说,它也只是个孩子。

1.复习Junit4和Junit Jupiter 

上面的代码是直接在src/main/java下新建一个类,并在主方法中完成的代码测试。实际上Maven是支持单元测试的,可以在src/main/test下使用测试类进行测试,比较方便。

我们先来回顾下Junit 4 和 Junit jupiter

   1、Junit 4,流行时间比较长,Java中常见的单元测试工具。

   2、Junit Jupiter,其实就是所谓的Junit 5,只是没有叫Junit 5,而是叫Junit Jupiter。Spring 最近几个 版本默认使用的就是Jupiter(直译:木星)。

使用两个测试工具主要区别是导入的依赖不同,在单元测试方法上添加的都是@Test注解,不同版本 @Test的包不一样。

Junit4的依赖和代码示例

pom.xml

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

代码示例

package com.tong.test;
import org.junit.Test;
public class SpringTest {
   /*
    单元测试方法必须满足:
    @Test包:org.junit.Test
    访问权限修饰符:public,其它运行报错
    返回值:void,其他运行报错
    方法名:随意
    参数:无参,其他运行报错
    */
@Test
public void test(){
      // 单元测试代码
     }
}

Junit Jupiter的依赖和代码示例

pom.xml

<dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.9.2</version>
      <scope>test</scope>
</dependency>

代码示例

package com.tong.test;
import org.junit.jupiter.api.Test;
public class SpringTest {
  /*
   @Test:org.junit.jupiter.api.Test;
   访问权限修饰符:public/protected/default都可以。private后IDEA不出现运行异常了。推荐:
   default
   返回值:应该是void。其他类型不报异常,但是没有效果。
   方法名称:随意。
   参数:不应该有参数。
*/
@Test
void test(){
    // 单元测试代码
    }
}

2. BeanFactory代码演示

BeanFactory的代码相对ApplicationContext的代码要复杂一点。

想要写出BeanFactory必须要加注下面几个类。

代码示例:

package com.tong.test;
import com.tong.pojo.People;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.FileSystemResource;

public class SpringTest {
@Test
void testBeanFactory(){
       DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
       XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
       xmlBeanDefinitionReader.loadBeanDefinitions(new FileSystemResource("D:\\idea\\idea2022ws\\summer\\src\\main\\resources\\applicationContext.xml"));
       People peo = defaultListableBeanFactory.getBean("peo", People.class);
       System.out.println(peo);
   }
}

 七、实例化Bean的两种方式

在Spring中实例化(Instantiation)Bean有两种方式:

 1、通过构造方法进行实例化。默认使用无参构造。这种方式和以前new的方式是等效的。上面的第一 个Spring项目其实就是这种,只需要在XML中通过 的class属性指定类的全限定路径,然后 就可以实例化对象。其实构造方法实例化方式又可以细分为无参构造方式和有参构造方式。本小节 只说无参构造方式,有参构造方式放在DI两种方式中进行讲解。

2、通过工厂进行实例化。可以通过静态工厂和实例工厂进行实例化。这种方式完全是根据设计模式中 工厂模式的思想而研发出的。Spring考虑到如果需要频繁实例化某个类的对象,工厂模式无疑是一 个好选择。

1.构造方法实例化 

在People类中无参构造方法输出语句。

public People() {
     System.out.println("这是People的无参构造方法");
}

测试效果,发现会调用构造方法

2.使用实例工厂实例化bean 

2.1 创建工厂类

实例工厂方式需要实例化工厂类。所以工厂中创建bean的方法是一个实例方法。

在项目中创建实例工厂类,并编写方法返回创建的实例对象。

示例中创建com.bjsxt.factory.PeopleFactory

package com.tong.factory;
import com.tong.pojo.People;
   /*
   实例工厂:工厂类需要实例化。
   PeopleFactory factory = new PeopleFactory();
   People peo = factory.newInstance();
   */
public class PeopleFactory {
     // 在全局实例化一个People对象?无所谓的。
     People peo = new People();
     public People newInstance(){
     return peo;
     // return new People();// 可以的,只是每次都获取到的是一个新的People实例。
    }
}

2.2 配置配置文件

在applicationContext.xml中先配置工厂实例,然后通过工厂实例产生自己想要的bean对象。

小提示: 实例工厂方式peo2的 标签没有class属性。

<!-- 创建工厂实例 -->
<bean id="factory" class="com.tong.factory.PeopleFactory"></bean>
<!-- factory-bean:工厂对象的id factory-method:创建当前bean的方法名称 -->
<bean id="peo2" factory-bean="factory" factory-method="newInstance"></bean>

 2.3 在测试类中测试效果

运行SpringTest类,发现控制台可以输出People对象信息。

/*
  实例工厂方式
*/
@Test
void factory(){
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
     People peo2 = context.getBean("peo2", People.class);
     System.out.println(peo2);
}

3. 使用静态工厂实例化bean

3.1 创建工厂类

静态工厂和实例工厂类最主要的区别是,创建bean的方法是static修饰的。 创建静态工厂类:com.tong.factory.PeopleStaticFactory

package com.tong.factory;
import com.tong.pojo.People;
  /*
   静态工厂:负责生产产品的方法是static的。
   People peo = PeopleStaticFactory.newInstance();
  */
public class PeopleStaticFactory {
      static People peo = new People();
      public static People newInstance(){
              return peo;
     }
}

3.2 配置配置文件

在applicationContext.xml中配置bean,注意bean标签中属性含义:

1、class:静态工厂类的全限定路径

2、factory-method:静态工厂中创建bean的静态方法。

之所以可以这样配置,是因为Java中静态方法是通过类名直接调用,不需要创建工厂的实例。

<!-- 静态工厂-->
<bean id="peo3" class="com.tong.factory.PeopleStaticFactory" factory-method="newInstance"></bean>

3.3 在测试类中测试效果

运行SpringTest类,发现控制台可以输出People对象信息。

/*
静态工厂方式
*/
@Test
void staticFactory(){
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
     People peo3 = context.getBean("peo3", People.class);
     System.out.println(peo3);
}

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

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

相关文章

hadoop学习之hdfs学习

HDFS 文件系统,可以说是分布式数据库吧 结构是 目录树 适用场景:一次写入,多次读出.好像不太支持改删 优点: 1.高容错: 因为他会备份,所以一份出问题了,并不影响其他几份 如果副本丢失后,定时恢复.应该是定时检查然后恢复 每次启动,DN向NN汇报备份的存储情况.默认每个6个小时重…

波奇学Linux:git和gdb调试

git用来版本控制&#xff0c;同样是版本控制的软件还有svn等。 git的特定是具有网络功能的版本控制器&#xff0c;开源&#xff0c;client和server是一体的。(去中心化分布式管理) client和server一体意味着远程仓库和本地仓库是平等地位&#xff0c;远程仓库是特殊的仓库而已…

rtmp推流

目录 1、解压代码工程2、进入工程文件夹3、修改Makefile中的交叉编译路径4、编译5、板子上6、window上打开ffplay进行拉流注意:推流之前要先搭建好nginx服务器 1、解压代码工程 sudo unzip ffmpeg_rv1126_network_project_mark_finally.zip 2、进入工程文件夹 cd ffmpeg_rv…

AudioFocus源码分析

使用情景 在音视频app开发中一般会遵循音频焦点的机制&#xff0c;播放时申请音频焦点&#xff0c;丢失焦点后暂停播放&#xff0c;恢复焦点后继续播放等。尤其在车载开发时&#xff0c;涉及到三方应用和自研应用&#xff0c;导致经常出现音频焦点混乱混音等问题。 private f…

分享几个不常用的web api

分享几个不常用的web api 屏幕捕获 顾名思义&#xff0c;屏幕捕获 API 允许我们捕获屏幕内容&#xff0c;从而使构建屏幕录制的过程变得轻而易举。 在示例中我们使用video标签来显示捕获屏幕内容。 <video id"preview" autoplay>不支持HTML5 </video>…

Jmeter(119)-函数threadNum妙用

今天的接口场景是&#xff1a;有N个用户需要每隔5秒去查询一次数据&#xff0c;也就是说N个用户会去循环执行同一个接口。一开始的时候将用户参数化时使用了counter&#xff0c; 要执行2个线程3次循环&#xff0c;发现每次循环时&#xff0c;接口中用户参数的数据就会不一样&am…

统计页面左右+上下自适应布局

1:如果需要调整分栏数量,那么只需要删除对应数据,修改百分比即可. <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css" lang"less" >body{margin: 0px ;}.box…

2.1Label Button 标签和按钮

2.1Label & Button 标签和按钮 窗口主体框架 每一个 tkinter 应用的主体框架都可以包含下面这部分. 定义 window 窗口 和 window的一些属性, 然后书写窗口内容, 最后执行window.mainloop让窗口活起来. import tkinter as tkwindow tk.Tk() window.title(my window) wind…

【C语言高阶篇】成为编程高手必学内容,程序中的动态内存分配我不允许还有人不会!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《快速入门C语言》《C语言高阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言&#x1f4ac; 为什么存在动态内存分配&#x1f4ac; 动态内存函数的介绍1️⃣ 动态内存函数 malloc&#…

西门子PLC上位机测试

上一篇我们讲了三菱PLC的数据通信方法&#xff0c;今天我们讲讲另外一个PLC巨头--西门子。 西门子有很多系列&#xff0c;今天讲到的是用S7协议的S71200。西门子同样提供了丰富的集成库&#xff0c;例如S7.NET&#xff0c;对于C#上位机开发&#xff0c;是非常容易的事情。 首…

API开发,机器人api二次开发

由于自身在机器人方面滚爬多年&#xff0c;尝试了很多次&#xff0c;选择了一个信任的工具 可以给有需要的朋友们借鉴一下 开发起来很方便&#xff0c;技术也已经挺成熟的了 贴一点简单的给大家看下呢 测试文档&#xff1a;https://www.wkteam.cn/ 简要描述&#xff1a; …

10.Ceph接口使用

文章目录 Ceph接口使用CephFS文件系统服务端添加mds服务创建存储池授权用户权限 客户端前期准备客户端挂载方式一&#xff1a;基于内核方式二&#xff1a;基于 fuse 工具 Ceph 块存储系统 RBD 接口服务端创建存储池和镜像管理镜像 客户端镜像挂载快照管理快照分层快照展平镜像的…

Ubuntu20.04升级到Ubuntu 22.04

升级Ubuntu到最新版本 执行如下命令将Ubuntu升级到最新的版本&#xff1a; $ sudo apt update && sudo apt upgrade -y升级完成后&#xff0c;重启系统 reboot重启成功之后&#xff0c;查看系统的当前版本 $ lsb_release -a最新版本应该是20.04.6&#xff0c;如下图…

JTS-Orientation方向计算

org.locationtech.jts.algorithm.Orientation 使用说明 用于计算基本几何结构(包括点三重体(三角形)和环)的方向的函数。方向是平面几何的基本属性。 Orientation.index(Coordinate p1, Coordinate p2, Coordinate q) 说明 计算q点处在p1点->p2点方向的左侧还是右侧,左侧…

9. selenium API 【万字】

目录 1. 元素的定位 1.1 css selector 1.1.1 id 选择器 1.1.2 类选择器 1.1.3 标签选择器 1.1.4 后代选择器 1.2 xpath 1.2.1 相对路径 索引 1.2.2 相对路径 元素 1.2.3 相对路径 通配符 1.2.4 相对路径 部分元素定位 1.2.5 相对路径 文本定位 1.3 应用&…

gazebo软件建立带摄像和红外功能的小车

背景&#xff1a; 为了方便调整摄像头的高度&#xff0c;我需要重新构建以下带小车的模型。小白分享来了。 目录 1. 先构建一个能跑的小车。 1.1 gazebo设计四个物体&#xff1a;车体三个车轮。组合然后构建好后在本地保存成小车模型。 1.2 打开本地文件添加plugin插件&…

转行软件测试成功的关键因素是什么?

三年前张伟是一名厨师,职高毕业&#xff0c;团队一共有5个人&#xff0c;大家各自负责自己的模块&#xff0c;整体上感觉相差不大&#xff0c;特别的团结稳定。 可是后来随着疫情的发生&#xff0c;对整个社会都产生了严重的冲击&#xff0c;饭店每天的订单是越来越少&#xf…

Spark 4:Spark Core 共享变量

广播变量 # coding:utf8 import timefrom pyspark import SparkConf, SparkContext from pyspark.storagelevel import StorageLevelif __name__ __main__:conf SparkConf().setAppName("test").setMaster("local[*]")sc SparkContext(confconf)stu_inf…

设计模式day03

01gradle极速安装与配置入门 下载6.8.2版本,配置环境变量 配置镜像仓库 给gradle安装目录下init.d文件夹&#xff0c;放一个init.gradle文件&#xff0c;内容如下&#xff1a; gradle.projectsLoaded {rootProject.allprojects {buildscript {repositories {def JCENTER_URL…

go语言计算推算心率算法 http服务

目的 为了计算心率和并且将心率计算作为http服务来运行 几种计算方法 1 基本数据 a&#xff09; hrv heart rate variability b&#xff09; 呼吸 2 傅里叶变换 计算频率 高频和低频 3 隐形马尔科夫 模型 hmm 重在于推测概率 根据最近的心率计算 4 神经网络计算 基本计算 …