百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

ApplicationContext与BeanFactory的区别

xsobi 2024-11-24 23:35 22 浏览

ApplicationContext与BeanFactory

spring是一个容器框架,把一个类交给spring容器管理,包括了创建对象、保存对象、对象的初始化和销毁。 IOC:Inverse of control - 控制反转;将对象创建的权利和依赖关系的维护【给字段赋值】交给Spring去管理。

简单来说:spring容器就是一个管家,专门管理对象(Spring中管理的对象称之为bean)。我们需要先创建一个”管家对象“,可以是ApplicationContext或者BeanFactory。

BeanFactory

BeanFactory是IOC容器的核心接口,spring容器中有BeanFactory的具体实现:DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等;比如XMLBeanFactory就是一种典型的BeanFactory。

注意:

Spring要帮我们创建对象,我们把创建的对象都叫做bean,但是咱们得写配置告诉Spring,去帮咱们创建哪一个对象 (注册)。

bean:配置一个bean对象

id:这个bean的唯一名称

class:要配置的对象的类型(必须是全限定名)

Spring是通过反射去创建这个对象的。

在配置文件中将这个Java类交给Spring管理。在applicationContext.xml中配置

Bash
<!-- 这个类现在交给spring管理了-->
<bean id = "hello" class= "cn.itsource._01hello.SpringHello">
</bean>
Bash
//使用XMLBeanFactory获取Spring容器中配置或注册的Bean对象
	@Test
	public void test() {
		 //读取核心的配置文件
		 ClassPathResource resource = new ClassPathResource("ApplicationContext.xml");
		 //拿到核心对象
		 BeanFactory BeanFactory = new XmlBeanFactory(resource);
		 //根据xml配置的id获得bean对象
		//根据配置文件的id获取对象,spring不知道类型,需要强转
		 SpringHello bean = (SpringHello) BeanFactory.getBean("hello");
		 System.out.println(bean);
		//根据配置文件的类型获取对象
		 SpringHello bean2 = BeanFactory.getBean(SpringHello.class);
		 System.out.println(bean2);
		//根据配置文件的id,和类型获取对象
		 SpringHello bean3 = BeanFactory.getBean("hello",SpringHello.class);
		 System.out.println(bean3);
	}

测试运行可以看出:三种方法都可以拿到被spring管理的类的对象,并且都是同一个对象。

ApplicationContext

ApplicationContext的中文意思是"应用程序上下文",它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持(功能更强大)。相对于XmlBeanFactory更多使用ApplicationContext。

	@Test
	public void test2() {
		//1.获到核心配置文件  applicationContext.xml
		//2.拿到核心对象(相当于启动了框架)
		//ClassPathXmlApplicationContext
		// 注意:ApplicationContext就是一个Bean工厂,且功能强大得多
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		//根据配置文件的id获取对象,spring不知道类型,需要强转
		SpringHello bean = (SpringHello) context.getBean("hello");
		System.out.println(bean);
		SpringHello bean2 = context.getBean("hello",SpringHello.class);
		System.out.println(bean2);
		//根据配置文件的类型获取对象
		SpringHello bean3 = context.getBean(SpringHello.class);
		System.out.println(bean3);
	}

测试运行可以看出:三种方法都可以拿到被spring管理的类的对象,并且都是同一个对象。

两种方式的加载模式

BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。

相对于基本的BeanFactory,ApplicationContext

唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

举个例子

在applicationContext.xml我们多配置一个bean。

	<bean id = "hello" class= "cn.itsource._01hello.SpringHello">
	</bean>
	
	//测试两种加载的区别
	 <bean id="test1" class="cn.itsource._02di.Tets1">
	 </bean>

在测试类的无参构造里面打印一句话,如果显示出来,代表调用了无参构造创建对象

//这是测试类,已经配置到xml里面了
public class Tets1 {
	public Tets1() {
		super();
		System.out.println("我也被创建了");
	}

然后先运行test:用XmlBeanFactory的方式: 这种方式只创建了我们调用getBean方法的对象(延迟加载/懒加载)

再运行test2: 配置在xml里面的bean都被创建了(迫切加载)

相关推荐

建站 | 从零开始打造自己的网站--以创意众筹网项目为例

文/跨界哥经过前几期的思考探索,跨界哥的创意众筹网项目的大概框架已经有了雏形,今天真正开始着手网站的建设。从零开始打造属于自己的网站,自己终于做了站长,想想还是有点小激动。简单描述下创意众筹网的核心业...

MyEclipse应用服务器教程:应用程序服务器入门指南(上)

1.定义一个新的服务器定义一个新的服务器允许您选择需要使用的服务器连接,并提供配置信息,然后选择项目部署到服务器上。(1)在服务器视图工具栏上点击new_server_icon。或者右键单击服务器视...

ABP异常为什么是403呢?

前言在ABP中使用UserFriendlyException抛出异常,HTTP状态码为什么是403?下面用这一段测试代码:[HttpPost]publicasyncTask<PeopleD...

Web自动化测试:模拟鼠标操作(ActionChains)

在日常的测试中,经常会遇到需要鼠标去操作的一些事情,比如说悬浮菜单、拖动验证码等,这一节我们来学习如何使用webdriver模拟鼠标的操作首页模拟鼠标的操作要首先引入ActionChains的包fro...

webapi 全流程

C#中的WebAPIMinimalApi没有控制器,普通api有控制器,MinimalApi是直达型,精简了很多中间代码,广泛适用于微服务架构MinimalApi一切都在组控制台应用程序类【Progr...

SpringBoot日志处理之Logback

日志处理是一个正式项目必备的功能,日志要能够根据时间、类型等要素,根据指定格式来保存指定的日志,方便我们观察程序运行情况、定位程序bug。SpringBoot中推荐使用Logback日志框架。slf4...

ASP.NET Core Web API 接口限流

一.前言ASP.NETCoreWebAPI接口限流、限制接口并发数量,我也不知道自己写的有没有问题,抛砖引玉、欢迎来喷!二.需求写了一个接口,参数可以传多个人员,也可以传单个人员,时间范围...

高德打车通用可编排订单状态机引擎设计

一背景订单状态流转是交易系统的最为核心的工作,订单系统往往都会存在状态多、链路长、逻辑复杂的特点,还存在多场景、多类型、多业务维度等业务特性。在保证订单状态流转稳定性的前提下、可扩展性和可维护性是我...

.Net6基础功能封装分享12(统一参数校验)

开发后台webapi接口,需要对接口传入的参数进行校验,如果传入的参数不符合验证规则,就直接返回参数错误,就需要封装统一参数校验过滤器;在.net6中,内置了DataAnnotations实现通过数据...

Path to prosperity for US and the world lies in cooperation, not confrontation

ThisisaneditorialfromChinaDaily.Turningadeafeartothe"handsoff"criesofprotestersnot...

C++ strategy策略模式

策略模式策略模式是一种行为设计模式,它定义了一组算法,他们可以以相同的接口共享。这种模式使用场景最多的就是在根据不同的条件选择不同的行为时,可以使用此模式进行解耦,使得你的代码更加易于维护和扩展,当然...

万字图文详解24种设计模式

一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。设计模...

25000 字详解 23 种设计模式(多图 + 代码)

文章来源:https://javadoop.com/post/design-pattern目录创建型模式结构型模式行为型模式总结前言一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看...

C# 设计模式之-状态模式

问题引入仓库管理系统中,堆垛机任务的状态的变更,一般会引起一系列相关的的变更,如入库完成,就需要修改库位状态为:工作中;出库完成,则需要将任务对应的库位状态修改为:空闲;此时可以使用状态模式来将堆垛机...

seata-golang 接入指南

作者|刘晓敏来源|阿里巴巴云原生公众号seata-golang是一个分布式事务框架,实现了AT模式和TCC模式,AT模式相较TCC模式对代码的入侵性更小、需要开发的接口更少;但A...