Spring IOC详解与配置

Spring:

框架:

具有一定功能的半成品软件,基于框架会节省开发成本

框架作用:

提高开发效率、复用性、编写规范、节约维护成本、解耦底层实现原理

Spring:

  • Spring是分层的JavaSE/EE应用full-stack轻量级开源框架
  • Spring主要是做整合,可以理解是一搜航空母舰,上面放置了很多的战斗机
  • Spring核心是IOC(控制反转) 和 AOP(面向切面编程)
  • Spring提供了对各种优秀框架的支持和 整合

Spring优点:

  1. IOC解耦
  • 可以将对象间的依赖关系交由spring管理
  • 避免硬编码造成的程序间过渡耦合
  1. 支持AOP
  • 可以使用切面编程思想对方法进行增强
  1. 支持声明式事务
  • 可以通过配置或者注解的方式管理事务
  • 不需要硬编码管理事务
  1. 方便测试
  • 可以通过注解方便的测试Spring程序
  1. 方便集成
  • 其内部提供了对各种优秀框架的直接支持
  1. 使用简单
  • Spring对很多难用的API做了简单的封装
  1. 设计精良
  • Spring的源码设计精妙、结构清晰值得学习

不使用Spring会有什么影响:

会造成(常见的):

  1. 依赖问题
  2. 耦合问题
    1. 实现类丢失会影响其他层
      2. 实现类切换会影响其他层
  3. 创建顺序
  4. 对象个数

Spring体系结构:

在这里插入图片描述

Data Access/Integration

  • JDBC: 对各大数据库厂商进行抽象处理
  • ORM: 集成orm框架支持对象关系映射处理
  • OXM: 提供了对 Object/XML映射实现的抽象层
  • JMS: 主要包含了一些制造和消费消息的特性
  • Transactions: 支持编程和声明式事务管理

Web

  • Websocket: 提供了WebSocket和SocketJS的实现
  • Servlet: 利用MVC(model-view-controller)的实现分离代码
  • Web: 提供了基础的面向 Web 的集成特性(如: 文件上传)
  • Portlet: 提供了Portlet环境下的MVC实现

中间层

  • AOP: 提供了符合AOP要求的面向切面的编程实现
  • Aspects: 提供了与AspectJ的集成功能
  • Instrumentation: 提供了类植入(Instrumentation)的支持和类加载器的实现
  • Messaging: 用于构建基于消息的应用程序

Core Container

  • Beans: Bean工厂与bean的装配
  • Core: 依赖注入IoC与DI的最基本实现
  • Content: IOC容器的企业服务扩展
  • SpEl: 用于在运行时查询和操纵对象的表达式

Test

  • 支持使用 JUnit 和 TestNG 对 Spring 组件进行测试

耦合&内聚:

耦合(Coupling)

代码书写过程中所使用技术的结合紧密度,用于衡量软件中各个模块之间的互联程度

内聚(Cohesion)

代码书写过程中单个模块内部各组成部分间的联系,用于衡量软件中各个模块内部的功能联系

程序书写的目标:高内聚、低耦合,就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度不要那么紧密

在这里插入图片描述

配置文件耦合不是java类耦合,解决耦合问题
在这里插入图片描述

IOC容器:

  • IoC(Inversion Of Control)控制反转,Spring反向控制应用程序所需要使用的外部资源,转交给第三方(工厂)完成
  • Spring控制的资源全部放置在Spring容器中,该容器称为IoC容器
  • Ioc就是从自己new对象,变成spring给你对象,都放在ioc容器里

IOC的作用:

  1. 解耦: 利用IOC的工厂模式解耦创建对象的过程
    • 解决代码耦合度过高问题
  2. 存储对象: 可以将创建好的对象 存储 起来重复使用
    • 解决对象个数问题
  3. 管理依赖关系: 可以将依赖对象注入需要的对象当中
    • 解决依赖关系问题
  4. 管理对象创建顺序: 可以根据依赖关系先后创建对象
    • 解决创建顺序问题

入门案例:

  1. 导入spring坐标(5.1.9.release)
    <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.5</version></dependency></dependencies>
  1. 编写业务层与表现层(模拟)接口与实现类
public interface UserService {public void save();
}
public class UserServiceImpl implements UserService {@Overridepublic void save() {System.out.println("UserService执行");}
  1. 建立spring配置文件,配置所需资源(Service)为spring控制的资源
<?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"><!--创建spring控制资源   id随便写,class写实现类--><bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
</beans>
  1. 测试
public class UserServiceTest {@Testpublic void save() {// 加载配置文件ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取资源UserService userService = (UserService) ctx.getBean("userService");userService.save();}
}

IoC配置(XML格式)

bean

  • 名称:bean
  • 类型:标签
  • 归属:beans标签
  • 作用:定义spring中的资源,受此标签定义的资源将受到spring控制
属性说明
id对象的引用名称;一定要唯一; 一次只能定义一个引用名称,通过id值获取bean
name对象的引用名称; 与id区别是:name一次可以定义多个引用名称。
classbean的类型,类的全限定名称
init-method指定类中初始化方法的名称,在构造方法执行完毕后立即执行
destroy-method指定类中销毁方法名称,在销毁spring容器前执行
lazy-init设置为true表示在第一次使用对象的时候才创建,只对单例对象有效。
scope设置bean的作用范围, 取值:
singleton:单例, 默认值;
prototype:多例
request:web项目中,将对象存入request域中
session:web项目中,将对象存入session域中
globalsession:web项目中,将对象应用于集群环境,没有集群相当于session

格式:

<beans><bean />
</beans>

基本属性:

<!--    id:bean的名称,通过id值获取beanclass:bean的类型name:bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名,可以定义多个,用逗号隔开,测试类写哪个都可以获取
--><bean id="userService" name="userService2,userService3" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
  • BeanFactory是Spring容器的顶层接口, 采用 延迟创建 对象的思想
  • ApplicationContext是BeanFactory的子接口, 采用 即时创建 对象的思想

bean属性scope

  • 名称:scope

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean的作用范围

  • 格式:

<!--scope: 设置对象的作用范围singleton: 默认值, 表示为单例模式: 对象只创建一次prototype: 多例模式, 标识对象每次使用都创建一个新的 (并且不会将对象存储到IOC容器中)--><bean init-method="init" destroy-method="destroy" scope="prototype" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
    @Testpublic void save2() {// 加载配置文件ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取资源UserService userService = (UserService) context.getBean("userService");UserService userService2 = (UserService) context.getBean("userService");System.out.println(userService);System.out.println(userService2);System.out.println(userService == userService2);/*      singleton打印结果com.itzhzhu.service.impl.UserServiceImpl@3f6f6701com.itzhzhu.service.impl.UserServiceImpl@3f6f6701trueprototype打印结果com.itzhzhu.service.impl.UserServiceImpl@52b1beb6com.itzhzhu.service.impl.UserServiceImpl@273e7444false
*/}

取值:

  • singleton(默认配置):设定创建出的对象保存在spring容器中,是一个单例的对象,地址值都一样的,加载spring容器的时候就会初始化
  • prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象,加载容器不初始化,获取的对象时候创建,用一个创建一个
  • request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置

bean生命周期

  • 名称:init-method,destroy-method

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean对象在初始化或销毁时完成的工作

  • 格式:

<bean init-method="init" destroy-method="destroy></bean>

取值:bean对应的类中对应的具体方法名

注意事项:

  • 当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次

  • 当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次

  • 当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次

  • 当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行

bean对象创建方式

factory-bean

如果项目之前没有使用Spring会用到这种方式

  • 名称:factory-bean

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean对象创建方式,使用静态工厂的形式创建bean,兼容早期遗留系统的升级工作

  • 格式:

<bean class="FactoryClassName" factory-method="factoryMethodName"></bean>

取值:工厂bean中用于获取对象的静态方法名

注意事项:

  • class属性必须配置成静态工厂的类名
factory-bean,factory-method
  • 名称:factory-bean,factory-method

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean对象创建方式,使用实例工厂的形式创建bean,兼容早期遗留系统的升级工作

  • 格式:

<!--实例工厂对应的bean-->
<bean id="factoryBeanId" class="类路径"/>
<!--实例工厂创建bean。依赖工厂对象对应的bean  factory-bean写上面的id,method写对应的方法名-->
<bean id="起名" factory-bean="对应上面的bean id" factory-method="factoryMethodName"/>

取值:工厂bean中用于获取对象的实例方法名

注意事项:

  • 使用实例工厂创建bean首先需要将实例工厂配置bean,交由spring进行管理

  • factory-bean是实例工厂的beanId

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

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

相关文章

android8.0的蓝牙版本,android o 新特性详解 安卓8.0蓝牙音频增强以及更加可爱的表情包...

android 8.0什么时候推出&#xff1f;有哪些新特色&#xff1f;很多安卓用户非常想知道答案吧&#xff01;不用着急&#xff0c;下面是大麦子小编整理出来的安卓8.0新特性详解&#xff0c;希望可以帮到大家。有媒体近日曝光了有关谷歌Pixel XL 2手机会首发Android 8.0系统。现在…

DOM初级篇

DOM是什么、作用、与javascript&#xff1f; DOM是对HTML文档的访问和操作&#xff0c;对文档的增删改查。 DOM相当于是javascript一个类&#xff0c;这个类中提供了多种操作HTML的方法&#xff0c;也可以说DOM是依附在JavaScript上进行操作的。 一、标签的查找命令&#xff1b…

vs2019开发android应用,VS 2019开发APP(一)界面和代码

1.界面在Resources>layout>目录下的*.xml文件就是界面文件2.关联界面接下来&#xff0c;通过将支持代码插入到 MainActivity 类中来添加代码以关联用户界面。在 MainActivity 类中找到 OnCreate 方法&#xff0c;在其中添加关联按钮代码如下&#xff1a;protected overri…

oracle 数据库字段html显示正常text显示不全,layui表格字段表格显示不全(自适应)...

本文将为您描述layui表格字段表格显示不全(自适应),具体操作方法:好记性不如烂笔头。本来就是没什么好记得东西&#xff0c;下次再用时已经想不起来了。问题如下&#x1f41f;使用layui表格&#xff0c;表格字段显示不全&#xff0c;如果超出分配的位置&#xff0c;就会显示省略…

使用 VSCode 编写 .NET Core 项目之初体验

注&#xff1a;本文在根据 微软官方文档指导下&#xff0c;根据自己的学习中整理&#xff0c;并不完全照搬文档&#xff0c;但也大体和文档学习路线相似&#xff0c;主要为记录学习过程。 官方学习地址&#xff1a; https://code.visualstudio.com/docs/other/dotnet https://d…

html模板安装到织梦,织梦网站安装教程 织梦模板通用安装图文教程

织梦模版怎么安装使用呢 下面就把我的经验分享给大家解压文件上传到服务器指定根目录输入主域名访问“例如&#xff1a;//www.jb51.net/install”步骤1&#xff1a;勾选同意协议&#xff0c;点击继续按钮。步骤2&#xff1a;检查系统环境和文件权限&#xff0c;确定权限正确才能…

金乡高考成绩查询2021,金乡一中举行2021届高三年级一模成绩分析暨表彰大会!现场颁奖...

集思广益查缺补漏&#xff0c;全力以赴保驾护航。为增强备考紧迫性&#xff0c;提高备考有效性&#xff0c;激发师生积极性&#xff0c;2021年3月22日晚&#xff0c;山东省金乡一中2021届高三年级一模成绩分析暨表彰大会&#xff0c;在文峰楼二楼报告厅召开&#xff0c;本次会议…

匿名类

一、匿名类&#xff1a;[ C# 3.0/.NET 3.x 新增特性 ] 1.1 不好意思&#xff0c;我匿了 在开发中&#xff0c;我们有时会像下面的代码一样声明一个匿名类&#xff1a;可以看出&#xff0c;在匿名类的语法中并没有为其命名&#xff0c;而是直接的一个new { }就完事了。从外部看来…

MySQL— 进阶

目录 一、视图二、触发器三、函数四、存储过程五、事务 一、视图 视图是一个虚拟表&#xff08;非真实存在&#xff09;&#xff0c;其本质是【根据SQL语句获取动态的数据集&#xff0c;并为其命名】&#xff0c;用户使用时只需使用【名称】即可获取结果集&#xff0c;并可以将…

HTML中del标记是什么意思,HTML del标记

本文概述HTML 标记用于表示已从文档中删除/删除的文本范围。它用作已删除内容的标记。浏览器通常通过在已删除的文本上打一行来呈现它, 尽管可以使用CSS属性更改它。注意&#xff1a;要标识已删除的文本和插入的文本, 请使用带有的标记, 该标记将在文档中显示已删除和插入的文本…

进制原码反码补码

进制&#xff1a; 概念&#xff1a; 进制&#xff1a;指进位制&#xff0c;是人们规定的一种进位方式&#xff0c;表示某一位置的数看&#xff0c;运算时是逢*进一位。十进制是逢十进一&#xff0c;二进制是逢二进一。以此类推。学习的目的就是为了数据运算过程理解的更加深刻…

什么是位运算符

位运算符&#xff1a; 概念&#xff1a; 位运算符指的是二进制位的运算&#xff0c;先将十进制数转成二进制后再进行运算。 在二进制位运算中&#xff0c;1表示true&#xff0c;0表示false。 <<有符号左移运算&#xff1a;&#xff0c;二进制位向左移动, 左边符号位丢弃…

鸿蒙开发工具下载设置Mac

下载工具&#xff1a; 首先到网站注册开发者身份及实名认证&#xff1a;https://www.harmonyos.com/cn/ 然后选择对应的系统下载开发工具 点击跳转下载 会自动下载一些开发语言环境&#xff0c;然后一路下一步就可以了 点击第一个 选择第二个带Java的 勾选Application Devic…

封装this关键字

封装&#xff1a; 封装概念&#xff1a;封装是面向对象三大特征之一&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff0c;目的就是隐藏实现细节&#xff0c;仅对外暴露公共的访问方式封装原则 将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接…

认识API

API&#xff1a; 概述&#xff1a; API (Application Programming Interface) &#xff1a;应用程序编程接口 例;&#xff1a;编写代码通过电脑控制挖掘机炒菜&#xff0c;那么挖掘机厂家就要提供一些控制挖掘机的接口类&#xff0c;这些类中定义好了操作挖掘机的动作&#xf…

计算机专业论文设计与实现,计算机专业论文 计算机网络的设计与实现.doc

计算机专业论文 计算机网络的设计与实现.doc文档编号&#xff1a;1385463文档页数&#xff1a;9上传时间&#xff1a; 2021-02-24文档级别&#xff1a;普通资源文档类型&#xff1a;doc文档大小&#xff1a;69.50KB黑龙江广播电视大学黑龙江广播电视大学 毕业设计(论文)毕业设计…

StringStringBuilder的使用

String String 类在 java.lang 包下&#xff0c;所以使用的时候不需要导包String这个类比较特殊, 打印其对象名的时候, 不会出现内存地址&#xff0c;而是该对象所记录的真实内容. 面向对象-继承, Object类 特点&#xff1a;Java 程序中所有的双引号字符串&#xff0c;都是 Str…

计算机路表配置命令,计算机、华为交换机、路由器配置命令表

计算机、华为交换机、路由器配置命令表 (7页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;15.9 积分&#xfeff;华为路由器配置命令表计算机命令~~~~~~~~~~ PCA login: root &#xff1b;使用root用…

Python中的一些小语法

目录&#xff1a; 生成随机数将一个字符串变为datetime类型&#xff0c;并且获取星期几1.生成随机数 假设我们要操作的list如下&#xff1a; >>> import random>>> list1 [apple,pen,piple,have,an]1.1 随机选取某个字符串 >>> random.choice(list…

计算机语言2进制怎么计算,计算机语言二进制…八进制、十进制…怎样推算?数制是怎么读?...

满意答案hhaynyy2013.07.03采纳率&#xff1a;47% 等级&#xff1a;12已帮助&#xff1a;16403人其实每个进制的原理有一样&#xff0c;只是我们太习惯用十进制了(听说是因为人的十根手指的关系)&#xff0c;你想想二进制只用0和1表示实际数值&#xff0c;所以书写起来很‘累…