Spring 概述

1 了解Spring框架

1.1 框架

框架,特指为解决一个开放性问题而设计的具有一定约束性的基础架构。在此架构上可以根据具体问题进行扩展和定制,添加更多的组成部分,从而更迅速和方便地构建完整的解决问题方案。

框架,是一种可重用的设计,相当于一个半成品或者说模板,让使用者可以遵循框架的设计快速打造一个成品。

1.2 认识Spring框架

Spring框架:

  • Spring是一个JavaSE/EE的一站式轻量级开源框架

  • 用于创建松散耦合和易测试的程序,解决企业开发的复杂性。

  • Spring是一个基于IoC思想和AOP思想的容器框架。IoC- 控制反转(Inversion of Control)、AOP-面向方面/切面编程(Aspect Oriented Programming)

  • 使用Spring开发可以将Bean对象、Dao组件对象,Service组件对象等交给Spring容器来管理,有效的降低代码的耦合度,极大的方便项目的后期维护、升级和扩展。

  • 使用Spring框架,你不必编写大量的代码去实现框架已经实现的功能,很多事情都可以交给框架去做,如依赖的对象的实例化和注入(依赖注入)、事务的管理等。

1.3 Spring架构/模块

Spring模块化的框架,使用Spring可以只引入需要的模块,无需引入所有模块。

  1. Core Container: 框架核心模块,提供Spring框架基本功能,如IoC和DI支持
  2. Web: 提供Web开发支持
  3. AOP: 提供AOP支持
  4. Test: 支持单元测试和集成测试

2 IoC-控制反转

2.1 IoC理解

考虑如下代码:

public class A{
	B b=new B1();
    public void methodA(){
	    b.methodB();
    }
}

A强依赖于B1-紧耦合:一个系统的不同组件之间紧密关联,存在强依赖关系

对这份代码做一个修改:

public class A{
	B b;
    public void methodA(){
	    b.methodB();
    }
}

这里不再自己new B1的对象实现A对B1的弱依赖,实现松散耦合

于是我们可以有IoC的定义:

控制反转(IoC):将创建对象的权利交给框架(容器)管理,而不是自己new对象和管理对象。此外,框架可以根据依赖关系注入依赖的对象,开发者可以极大地从对象的管理中解脱出来。

DI(依赖注入) 是IoC思想的一个实现。

控制反转(IoC)不是一种技术,而是一种设计思想,指对一个对象的控制权的反转,主要是为了降低程序的耦合(coupling),也就是解耦(decoupling)

IoC的思想即为:

  • 一般,多个对象合作完成一个功能,这样在一个对象里,就需要使用另一个对象,以前我们可以用new object() 这样的语法来完成合作对象的创建,但是这样,对象间的耦合度高了。
  • IoC的思想是将程序对 对象 的控制权交给IoC容器
  • 不在程序中new对象,而是交给Spring去创建和管理对象。从主动获取对象到被动接受对象

2.2 Spring IoC容器

Web应用程序由大量的程序组件组成,这些组件一起工作完成业务逻辑的执行。 这些组件通常是一个依赖另一个,互相协作实现所需功能。

Spring提供容器,也就是IoC容器,来管理这些组件,我们叫做Bean,Spring容器负责创建、初始化和销毁其管理的各种Bean,并根据Bean的依赖关系注入依赖的Bean,也就是依赖注入(DI)。

Spring IoC容器的类型:

  • BeanFactory容器(Bean工厂容器):低级容器,提供容器的基本功能,包括Bean的管理和依赖注入。由org.springframework.beans.factory.BeanFactory接口表示
  • ApplicationContext容器(应用程序上下文容器):高级容器,提供BeanFactory容器的功能,还提供一些高级的企业级功能。由org.springframework.context.ApplicationContext接口表示。如果没有什么特殊理由,直接使用ApplicationContext容器即可

2.2.1 BeanFactory容器

首先读取spring配置文件,封装成一个Resource对象,通过该对象使用配置文件。

  • 如果spring配置文件放到了程序里,使用Resource接口的实现类ClassPathResource来加载spring配置文件
  • 如果spring配置文件放到了文件系统中(如C盘),使用Resource接口的实现类FileSystemResource来加载spring配置文件
Resource resource=new ClassPathResource("config/beans.xml");

BeanFactory是个接口,其中常用的一个实现类是XmlBeanFactory。XmlBeanFactory是读取xml配置文件,加载BeanFactory容器。需要传入一个Resource对象,说明关联的spring配置文件是哪个

BeanFactory beanFactory=new XmlBeanFactory(resource);

在容器中,默认一个bean是单例的,不管请求整个bean多少次(如调用getBean()方法),返回的都是同一个实例。

在BeanFactory容器中,bean是在第一次请求的时候被实例化。

 实例化的方法:

  1.  可以根据bean的id获取一个bean实例
  2.  可以根据bean的name(别名)获取一个bean实例
  3.  可以根据bean的类型获取一个bean实例,这样不需要转换类型
//1. 可以根据bean的id获取一个bean实例
Dog d1=(Dog)beanFactory.getBean("dog");
d1.eat();


//2. 可以根据bean的name(别名)获取一个bean实例
Dog d2=(Dog)beanFactory.getBean("gou");
d2.eat();


//3. 可以根据bean的类型获取一个bean实例,这样不需要转换类型
Dog d3=beanFactory.getBean(Dog.class);
d3.eat();

 2.2.2 ApplicationContext容器

  • 如果spring的xml配置文件在程序中,也就是类路径上,则使ClassPathXmlApplicationContext实现类
  • 如果spring的xml配置文件在文件系统中(如c盘),则使用FileSystemXmlApplicationContext实现类
ApplicationContext ctx=new ClassPathXmlApplicationContext("config/beans.xml"); 

可以指定一个或多个spring配置文件,形成一个上下文容器,这样该容器管理多个配置文件中定义的bean

ApplicationContext ctx=new ClassPathXmlApplicationContext("config/beans1.xml","config/beans2.xml","config/beans2.xml");

 在应用程序上下文容器中,容器启动,就会实例化所有的单例的bean。

默认情况下,一个bean是单例,也就是不管请求该bean多少次,返回的都是同一个实例。

实例化方法同BeanFactory容器

//1. 可以根据bean的id获取bean实例
Dog d1=(Dog)ctx.getBean("dog"); //2
d1.eat();
		
//2. 可以根据bean的name(别名)获取bean实例
Dog d2=(Dog)ctx.getBean("gou");
d2.eat();
		
//3.可以根据bean的类型获取bean实例
Dog d3=(Dog)ctx.getBean(Dog.class);
d3.eat();

3 配置Spring程序

Spring配置文件用于定义Spring管理的Bean(对象)。

3.1 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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">


	<!-- 被spring管理的一个bean使用bean标记来定义 -->
	<!-- class: 指定bean对应的类型的全限定名称 -->
	<!-- id: 用于指定一个名称,作为该bean的唯一标识符,如果不需要id,也可不指定该属性 -->
	<!-- name: 用于指定bean的别名,多个的使用空格或逗号或分号分割 -->
	<bean id="dog" name="gou,quan,wang" class="com.qdu.bean.Dog" />


	<!-- scope: 指定bean的范围,决定了bean实例化的数量 -->
    <!-- 
	有效值:
		singleton: 默认值,单例,每次请求一个bean,返回的是同一个共享实例
		prototype: 原型,每次请求一个bean,获取的是一个新的实例
		其他值包括:request, session, application, websocket等,是在web程序中使用
    -->
	<bean id="pig" class="com.qdu.bean.Pig" scope="prototype" />



    <!-- 如果不使用id,也可不指定id -->
	<!-- 对于单例的bean,容器启动的时候就会实例化 ,如果将lazy-init设置为true
		 则单例的bean在第一次请求的时候被实例化
		 scope为prototype的bean在每次请求的时候被实例化
	-->
	<bean class="com.qdu.bean.Sheep" lazy-init="true" />


</beans>

<bean>:

  • 被spring管理的一个bean使用bean标记来定义
  • class: 指定bean对应的类型的全限定名称
  • id: 用于指定一个名称,作为该bean的唯一标识符,如果不需要id,也可不指定该属性
  • name: 用于指定bean的别名,多个的使用空格或逗号或分号分割
  • scope: 指定bean的范围,决定了bean实例化的数量
  • scope有效值:
            singleton: 默认值,单例,每次请求一个bean,返回的是同一个共享实例
            prototype: 原型,每次请求一个bean,获取的是一个新的实例
            其他值包括:request, session, application, websocket等,是在web程序中使用
  • lazy-init: 对于单例的bean,容器启动的时候就会实例化 ,如果将lazy-init设置为true,则单例的bean在第一次请求的时候被实例化。scope为prototype的bean在每次请求的时候被实例化

3.2 Java代码配置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spark无法执行pi_如何验证spark搭建完毕

在配置yarn环境下的spark时&#xff0c;执行尚硅谷的以下命令发现报错&#xff0c;找不到这个也找不到那个&#xff0c;尚硅谷的代码是 bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ ./examples/jars/spark-exam…

初试占比7成!只考一门数据结构+学硕复录比1:1的神仙学校,大连交通大学考情分析

大连工业大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、24专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1014字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 大连工业…

企业电子招投标系统源码之电子招投标系统建设的重点和未来趋势

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

中危漏洞!小程序优惠卷遍历

进入小程序&#xff0c;因为是一个小商城&#xff0c;所以照例先查看收货地址是否存在越权&#xff0c;以及能否未授权访问&#xff0c;但是发现不存在这些问题&#xff0c;所以去查看优惠卷 进入领券中心&#xff0c;点击领取优惠券时抓包 发现数据包&#xff0c;存在敏感参数…

【android开发-14】android中fragment用法详细介绍

1&#xff0c;fragment是什么&#xff1f; Fragment是Android中的一种组件&#xff0c;它在Android 3.0&#xff08;API级别11&#xff09;及以后的版本中引入。Fragment可以用来在Activity中添加一个或多个具有自己的用户界面的片段。它们可以与Activity进行交互&#xff0c;并…

MS8231/8232微功耗、高精度、轨到轨输入输出运算放大器

产品简述 MS8231/8232 是单通道、双通道的轨到轨输入输出单电源运 放。它们具有很低的功耗和较高的精度&#xff0c;很适合电池供电和便携 式电子系统。 MS8231/8232 具有稳定的单位增益特性&#xff0c;并具有 13kHz 的信 号带宽&#xff0c;使其适合电池电流检测和传…

Ant Design Pro初始化报错

今天按照官网步骤初始化项目&#xff0c;第一次报错 fatal: unable to access https://github.com/ant-design/ant-design-pro/: SSL certificate problem: unable to get local issuer certificate 致命&#xff1a;无法访问https://github.com/ant-design/ant-design-pro/&…

虾皮数据分析网站:了解Shopee市场趋势与优化运营的利器

在如今的电商时代&#xff0c;越来越多的人选择在虾皮购物&#xff08;Shopee&#xff09;平台上开设自己的店铺。然而&#xff0c;要在这个竞争激烈的市场中脱颖而出并取得成功&#xff0c;并不是一件容易的事情。为了更好地了解市场趋势、优化产品和店铺运营&#xff0c;了解…

直流负载的核心组成

直流负载的核心组成包括电源、电阻和电流表&#xff0c;电源是直流负载的能量来源&#xff0c;通常采用直流电源或电池。电阻是直流负载的负载元件&#xff0c;用于消耗电流并产生电功率。电流表用于测量通过电阻的电流大小&#xff0c;在实际应用中&#xff0c;直流负载还可能…

全屏显示功能

全屏显示功能 screenfull 依赖下载 yarn add screenfull --save-dev使用 <template><!-- 全屏的字体图标 --><header><i class"iconfont icon-quanping"> </i></header> </template> <script> import screenfull …

openGauss学习笔记-142 openGauss 数据库运维-例行维护-导出并查看wdr诊断报告

文章目录 openGauss学习笔记-142 openGauss 数据库运维-例行维护-导出并查看wdr诊断报告 openGauss学习笔记-142 openGauss 数据库运维-例行维护-导出并查看wdr诊断报告 生成快照数据需参数enable_wdr_snapshoton&#xff0c;访问WDR快照数据需要sysadmin或monadmin权限&#…

Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100)

文章目录 报错信息问题原因解决方案 报错信息 Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100) 问题原因 更新 pandas 的时候自动安装了高版本的 pyzmq 依赖库。而 jupyter 依赖的是 pyzmq19.0.2 版本的。 同时&#xff0c;如果win电脑是中文的用户…

vs-code之vue3插件

1.Vue 3 Support - All In One Vue3 代码片段突出显示了 Visual Studio Code 的格式化程序生成器 生成vue3对应的的代码 如ref等&#xff0c; 2.Volar 相信使用 VSCode 开发 Vue2 的同学一定对 Vetur 插件不会陌生&#xff0c;作为 Vue2 配套的 VSCode 插件&#xff0c;它的主…

冰酒为什么贵?一篇给你讲清楚

冰酒因为昂贵被定义为&#xff1a;颜色和价格都如同黄金的奢侈品。那么&#xff0c;号称液体黄金的冰酒为什么这么贵呢&#xff1f;云仓酒庄给大家讲讲清楚。 云仓酒庄多品牌多代言运营模式&#xff0c;邀请当红明星来出席或代言自身产品&#xff0c;找到与品牌自身形象、调性相…

智能优化算法应用:基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.和声算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

如何看待 Android 面试却是 Java 面试官?

如何看待 Android 面试却是 Java 面试官&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Android资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

大学生如何搭建自己的网站

这篇是我在大一的时候&#xff0c;写过的一篇文章。 前言 作为一名大学生&#xff0c;我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假&#xff0c;我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路&#xff0c;也附带了一些零零散散的细节。时间跨度…

在用户不安装 ImageMagick 的情况下使用

需要以编程的方式配置环境变量&#xff08;手工配置也是一样的效果&#xff09; 1、首先要配置 path 将 {ImageMagick目录} 配置到path中 2、配置 MAGICK_HOME 将 {ImageMagick目录} 配置到MAGICK_HOME中 3、配置MAGICK_CODER_MODULE_PATH 将 {ImageMagick目录}\modules\…

自动驾驶:传感器初始标定

手眼标定 机器人手眼标定AxxB&#xff08;eye to hand和eye in hand&#xff09;及平面九点法标定 Ax xB问题求解&#xff0c;旋转和平移分步求解法 手眼标定AXXB求解方法&#xff08;文献总结&#xff09; 基于靶的方法 相机标定 (1) ApriTag (2) 棋盘格&#xff1a;cv::f…

分享77个菜单导航JS特效,总有一款适合您

分享77个菜单导航JS特效&#xff0c;总有一款适合您 77个菜单导航JS特效下载 链接&#xff1a;https://pan.baidu.com/s/1sfT9ONLH4ocliA1C7Z5xbQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0…