spring 上下文_一次性教你彻底理解 Spring容器和应用上下文!

553fc45c6d6ea0fa846334abce7114a2.png

作者:陈本布衣

www.cnblogs.com/chenbenbuyi

有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期。业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想要个对象——于是Spring就很贴心的给你个对象。

听起来似乎很简单,使用起来也不难,但是如果仅仅是这样的拿来主义,倒也洒脱,不用费什么脑子。。。可是,你就真的不关心,Spring是从哪里把对象给你的吗?

如果你想要了解Spring深一些,而不仅仅是拿来用用,那么你就应该好好思考一下上诉问题,不然,这篇博文你还看个铲铲啊。。。

你可以这样去思考:Spring既然要负责应用程序中那么多对象的创建管理,就像苹果要生产那么多的手机(对象)一样,肯定有一个专门搞对象的地方。苹果生产手机的地方叫工厂,比如富士康,但放在软件开发中,对于Spring搞对象的地方我们就不叫工厂了,而叫做容器。

是的,容器的概念在java中你最熟悉的莫过于Tomcat了,它正是一个运行Servlet的web容器,而Spring要想实现依赖注入功能,就离不开对象生产的容器——如果没有容器负责对象的创建管理,你的程序代码只是喊要对象了,Spring也无处给你啊。实际上,容器是Spring框架实现功能的核心,容器不只是帮我们创建了对象那么简单,它负责了对象整个的生命周期的管理——创建、装配、销毁。

关于Spring的这个容器你最常听闻的一个术语就是IOC容器。所谓IOC,是一种叫控制反转的编程思想,网上有很通俗易懂的总结,我就不胡乱阐述了。总之一句话,我的应用程序里不用再过问对象的创建和管理对象之间的依赖关系了,都让IOC容器给代劳吧,也就是说,我把对象创建、管理的控制权都交给Spring容器,这是一种控制权的反转,所以Spring容器才能称为IOC容器。不过这里要厘清一点:并不是说只有Spring的容器才叫IOC容器,基于IOC容器的框架还有很多,并不是Spring特有的。

好了,终于把Spring的容器概念阐述的差不多了,但有什么卵用呢?光有容器你其实什么都干不了!你以为容器那么科幻,跟叮当猫面前的百宝袋一样,你想要啥它就给你啥?实际上,容器里面什么都没有,决定容器里面放什么对象的是我们自己,决定对象之间的依赖关系的,也是我们自己,容器只是给我们提供一个管理对象的空间而已。那么,我们怎么向容器中放入我们需要容器代为管理的对象呢?这就涉及到Spring的应用上下文了。

什么是应用上下文呢,你可以简单的理解成就是将你需要Spring帮你管理的对象放入容器的那么一种。。一种。。额。。一种容器对象——是的,应用上下文即是Spring容器的一种抽象化表述;而我们常见的ApplicationContext本质上说就是一个维护Bean定义以及对象之间协作关系的高级接口。额,听起来是不是很抽象拗口?那你再读一遍呢。。。

这里,我们必须明确,Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;还有一种就是继承了BeanFactory后派生而来的应用上下文,其抽象接口也就是我们上面提到的的ApplicationContext,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景。

有了上下文对象,我们就能向容器注册需要Spring管理的对象了。对于上下文抽象接口,Spring也为我们提供了多种类型的容器实现,供我们在不同的应用场景选择:

  • ① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;

  • ② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;

  • ③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;

  • ④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;

  • ⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

有了以上理解,问题就很好办了。你只要将你需要IOC容器替你管理的对象基于xml也罢,java注解也好,总之你要将需要管理的对象(Spring中我们都称之问bean)、bean之间的协作关系配置好,然后利用应用上下文对象加载进我们的Spring容器,容器就能为你的程序提供你想要的对象管理服务了。下面,还是贴一下简单的应用上下文的应用实例:

我们先采用xml配置的方式配置bean和建立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"xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    <bean id="man" class="spring.chapter1.domain.Man">
        <constructor-arg ref="qqCar" />
    bean>
    <bean  id="qqCar" class="spring.chapter1.domain.QQCar"/>
beans>

然后通过应用上下文将配置加载到IOC容器,让Spring替我们管理对象,待我们需要使用对象的时候,再从容器中获取bean就ok了:

public class Test {
    public static void main(String[] args) {
        //加载项目中的spring配置文件到容器
//        ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml");
        //加载系统盘中的配置文件到容器
        ApplicationContext context = new FileSystemXmlApplicationContext("E:/Spring/applicationContext.xml");
        //从容器中获取对象实例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}

以上测试中,我将配置文件applicationContext.xml分别放在项目中和任意的系统盘符下,我只需要使用相应的上下文对象去加载配置文件,最后的结果是完全一样的。当然,现在项目中越来越多的使用java注解,所以注解的方式必不可少:

//同xml一样描述bean以及bean之间的依赖关系
@Configuration
public class ManConfig {
    @Bean
    public Man man() {
        return new Man(car());
    }
    @Bean
    public Car car() {
        return new QQCar();
    }
}
public class Test {
    public static void main(String[] args) {
        //从java注解的配置中加载配置到容器
        ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
        //从容器中获取对象实例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}

自此,Spring容器和应用上下文就算阐述的差不多了,具体的技能点在今后的博文中会慢慢的给大家奉上。

在公众号后台回复"微信"关键字,加群主微信免费加入高大上的架构之路微信群,设为星标,备注架构之路,(公众号主免进!)

热门精读

抛开Spring来说,如何自己实现Spring AOP?

这么牛逼的正则表达式,可惜你不会写!

2019年5月GitHub上最热门的开源项目

这几个Redis使用技巧,让你的程序快如闪电

这些只有程序员才能懂,Java被黑的太惨!

319fe4779d7f46f283cc3781d8ef132d.png

点在看的你,怎么这么可爱!

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

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

相关文章

oracle plsql 到处dbf_plsql 导出oracle数据库

plsql 导出数据库有两个问题&#xff0c;一个是只导出结构&#xff0c;一个是导出表结构加数据这样的&#xff0c;首先人家让我导成sql语句这不是简单&#xff0c;首先打开PLSQL一、导出结构1、然后tools->Export User Objects..然后出来一片空白2、要选择哪个User3、上面会…

python爬取百度百科搜索结果_用Python抓取百度搜索结果,python,爬取,的

前言前几天爬的今天整理了一下发现就两个需要注意的点一是记得用带cookie的方式去访问&#xff0c;也就是实例化requests.session()二是转化一下爬取到的url&#xff0c;访问爬到的url得到返回的Location值&#xff0c;该值便是真实的地址(如果你不是要爬url当我没说)知道了这两…

spring aop设计模式_Spring框架中设计模式的运用

设计模式大家可能随口就能说出总共有23种&#xff0c;但是具体怎么用&#xff0c;或者在常用的组建中有哪些体现&#xff0c;这时候不一定说的上来了。接下来几篇文章&#xff0c;我们一起深入理解。首先我们一起了解下常用的组建中是怎么运用的&#xff0c;比如 JDK、Sring、M…

使用yum命令安装mysql_Linux Centos 下使用yum 命令安装mysql实现步骤

linux centos 下使用yum 命令安装mysql实现步骤1. 查看服务器中有没有安装过mysql1. 查看有没有安装包:yum list mysql*#移除已经安装的mysqlyum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf2. 查看是否还有mysql软件:rpm -qa|gr…

sql unicode转中文_SELECT语句《SQL必知必会》

数据库中有哪些数据类型&#xff1f;数据库中最常用对数据类型有三种&#xff1a;Text&#xff08;文本&#xff09;、Number&#xff08;数字&#xff09;和 Date/Time。文本类型&#xff1a;即字符串&#xff0c;如“nameasdas”数字类型&#xff1a;十进制数字&#xff0c;如…

mpython 直接访问_如何从python代码中直接访问Android的Service

在Kivy中&#xff0c;通过pyjnius扩展可以间接调用Java代码&#xff0c;而pyjnius利用的是Java的反射机制。但是在Python对象和Java对象中转来转去总让人感觉到十分别扭。好在android提供了binder这个进程间通信的功能&#xff0c;Java中的Service也是基于Binder的C代码封装来实…

python中attr_python中hasattr()、getattr()、setattr()函数的使用

引言&#xff1a;在阅读高手写的代码时&#xff0c;有很多简写的形式&#xff0c;如果没有见过还真的看不太懂是什么意思&#xff0c;其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法&#xff0c;相关联的hasattr()、getattr()、setattr()函数的使用也一并学习…

python前n项和存为一个数组_在Python中存储多个数组

我正在编写一个程序来模拟像Gallup或Rasmussen这样的公司每天发布的实际投票数据&#xff1a;www.gallup.com和www.rassmussenreports.com我正在使用强力方法,计算机生成一些随机的每日轮询数据,然后计算三天平均值,以查看随机数据的平均值是否与民意测验数字相匹配. (大多数公…

织梦数据库改mysql前缀_织梦快速批量修改MYSQL数据库表前缀与表名实例操作

这篇文章主要为大家详细介绍了织梦快速批量修改MYSQL数据库表前缀与表名实例操作&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。我们在安装织梦系统的时候&#xff0c;有一次批量修改mysql数据库表前缀的机会&am…

python实时绘图暂停_Python实时绘图

我在两个数组中获取了一些数据&#xff1a;一个用于时间,一个用于值.当我达到1000点时,我触发一个信号并绘制这些点(x 时间,y 值).我需要在前面的图中保持相同的数字,但只是一个合理的数字,以避免减慢过程.例如,我想在我的图表上保留10,000点.matplotlib交互式绘图工作正常,但我…

python 读文件写数据库_python读文件写数据库

Python 读文件&#xff0c;写数据库Python 读文件打开文件Python读写文件在计算机语言中被广泛的应用&#xff0c;如果你想了解其应用的程序&#xff0c;以下的文章会给你详细的介绍相关内容&#xff0c;会你在以后的学习的过程中有所帮助&#xff0c;下面我们就详细介绍其应用…

python怎么用gamma函数_如何通俗的理解伽马(gamma)函数

如何通俗的理解伽马(gamma)函数 - 直觉&#xff0c;求导和示例我为什么要在乎garmma分布&#xff1f;使用伽马函数定义了许多概率分布&#xff0c;例如伽马分布&#xff0c;Beta分布&#xff0c;狄利克雷分布&#xff0c;卡方分布和学生t分布等。 对于数据科学家&#xff0c;机…

mysql支持表情输入_让MySQL支持Emoji表情 mysql 5.6

在做微信公众号开发过程中&#xff0c;经常碰到用户的昵称中有表情&#xff0c;在MySQL保存时常用的utf8 字符集根本无法存储表情&#xff0c;提示错误如下&#xff1a;java.sql.SQLException: Incorrect string value: \xF0\x9F\x92\x94 for column nick_name at row 1at com.…

graphpad如何检测方差齐_如何选择方差分析的多重比较方法?资料集锦

欢迎订阅SPSS训练营号方差分析时&#xff0c;如果因素主效应有显著影响&#xff0c;则需要对因素水平进行两两比较&#xff0c;以确认因素水平间的具体差异。这个过程也叫作多重比较。SPSS提供14种用于方差齐次的多重比较方法&#xff0c;还有4种方差不齐情况下的多重比较方法&…

编程真好玩python_(两本套)编程真好玩+教孩子学编程(Python语言版)

第1 章 Python 基础&#xff1a;认识环境 1 11 认识Python 3 12 用Python 编写程序 5 13 运行Python 程序 5 14 本章小结 6 15 编程挑战 7 第2 章 海龟作图&#xff1a;用Python 绘图 9 21 **个海龟程序 10 211 程序是如何工作的 10 212 发生了什么 12 22 旋转的海龟 13 23 海龟…

反转链表 python 递归_LeetCode 206.反转链表(Python3)

题目&#xff1a;反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题&#xff1f;解答&#xff1a;方法一&#xff1a;原地反转。# Definition for singly-…

java image 透明_java的BufferedImage对象透明化背景

近用到Java动态生成背景透明的图片功能&#xff0c;从gif和png中选择了png格式&#xff0c;个中缘由就不说了&#xff0c;于是动手到网上搜索有用的代码。现把搜索结果总结如下&#xff1a;1. 生成png图片int width 400;int height 300;// 创建BufferedImage对象BufferedImag…

【MySQL学习笔记009】事务

一、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 二、事务操作 1、操作1 查看/设置事务提交方式 select a…

python的pypi安装_python pip及安装包安装

python 微信聊天D:\untitled\hello.py 入口 web禁止登陆。。安装命令&#xff1a;手动安装&#xff1a;D:\python\setuptools-41.2.0>python setup.py install下载下来手动安装pipD:\python\pip-1.4.1\pip-1.4.1>python setup.py installD:\python\setuptools-41.2.0>…

python 爬取生意参谋数据_如何爬取生意参谋数据?是不是违规操作?

1、在淘宝选项卡中&#xff0c;打开【生意参谋】工具。2、在【生意参谋数据拷贝】中&#xff0c;点击【打开生意参谋】按钮。3、在调用的IE浏览器中输入账号和密码。4、登陆好后&#xff0c;找到竞品&#xff0c;并点击【查看详情】。5、进入到竞品详情后&#xff0c;注意修改日…