本文将介绍Spring的框架和本体内容,包括核心容器、注释开发、AOP和事务等。
所以简单说明一下Spring的必要性:
- Spring技术是JavaEE开发的必备技能,企业开发技术选型率高达90%!
- Spring有助于简化发展,降低企业级发展的复杂性
- Spring可以整合框架,有效整合其他技术,提高企业应用开发和运营效率
Spring的核心内容:
- Ioc技术
- DI技术
- AOP
- 事务处理
Spring可以进行框架集成:
- MaBatis
- MyBatis-plus
- Struts
- Struts2
- Hibernate
在下一篇文章中,我们将学习Spring的框架思想,学习Spring的基本操作,并结合案例掌握它
初识Spring温馨提醒:在学习本文之前,请先学习Javaweb的相关内容
(HTTP,Tomcat,Servlet,Request,Response,MVC,Cookie,Session,Ajax,Vue等内容)
官网:Spring | Home
Spring的发展已经形成了一个开发生态系统,Spring提供了相当多的项目,每个项目都用于完成特定的功能
常用的主流技术包括:
- Spring Framework:Spring框架
- Spring Boot:Spring简化代码开发
- Spring Cloud:Spring分布设计
在系统学习Spring之前,我们需要了解FrameWork系统的结构
- Spring Framework是Spring生态系统中最基本的项目,也是其他项目的基础
我们现在使用的Spring FrameWork是4.0版,已经趋于稳定
下面我们来解释一下架构图:
- Core Container:核心容器
- AOP:面向切面编程
- Aspects:实现AOP思想
- Data Access:数据访问
- Data Intergration:数据集成
- Web:Web开发
- Test:单元测试与集成测试
我们可以在官方中得到这样的评价:
- 强大的基于 JavaBeans 采用控制反转(Inversion of Control,IoC)原则的配置管理使应用程序的构建更加快捷简单。
- 数据库事务的一般抽象层允许插件式事务管理器简化事务的划分,使其与底层无关。
- 一个可以用于从 applet 到 Java EE 不同运行环境的核心等 Bean 工厂。
首先,让我们考虑一下我们以前的业务层和数据层:
如果我们修改BookDaoimpl内容,也应修改相应业务层实现中BookDao的new实现,甚至修改以下方法的对象
使用Spring前的问题代码书写现状:
- 耦合度偏高
解放方案:
- 使用对象时,不要在程序中主动使用new生成对象,并将其转换为从外部提供的对象
IoC(Inversion of Control)控制反转思想:
- 使用对象时,由主动new创建对象转换为外部提供对象
- 在此过程中,对象创建的控制权由程序转移到外部,称为控制反转
DI(Dependency Injection)依赖注入:
- 在容器中建立Bean和Bean之间的依赖关系和整个过程,称为依赖注入
Spring技术实现了Ioc思想:
- Spring提供了一个被称为物联网容器的容器,用作物联网思想的外部
- 物联网容器负责创建、初始化等一系列工作。物联网容器中创建和管理的对象称为Bean
目的:完全解耦
- IoC:使用IOC容器管理beann
- DI:在IOC容器中绑定依赖关系的bean
最终效果:
- 使用对象不仅可以直接从物联网容器中获得,还可以绑定已获得的Bean之间的依赖关系
首先,我们需要了解物联网的使用规则:
- IoC负责管理什么:Service和Dao
- 物联网容器是如何被管理对象告知的:(配置)
- 如何将管理对象交给物联网容器:(接口)
- 获得IoC容器后,如何获得Bean?:(接口方法)
- 使用Spring所需导入的坐标:(pom.xml)
以下是物联网入门的详细步骤:
- 在pommm创建Maven项目.将坐标导入xml
- 创建Spring.xml配置包(applicationContext.xml,XML在导入坐标后xml中更新)
- 主函数
首先需要了解DI的使用规则:
- bean基于IOC管理
- 使用new形式在Service中创建Dao对象是否保留:(否)
- 要求Dao对象在Service中进入Service:(提供方法)
- 如何描述Service和Dao之间的关系:(配置)
以下是DI入门的详细步骤(基于IOC入门):
- 删除new方法
- 创建对象的set方法
- 创建Dao和Service之间的连接
Bean是物联网中保存的对象,我们通过配置获得Bean
让我们从三个方面来解释Bean。:
bean基本配置首先我们先介绍一下bean本身的性质:
类别
描述
名称
bean
类型
标签
所属
beans标签
功能
Spring核心容器管理对象的定义
java主流基础框架格式
<beans><bean> </bean></beans>
属性列表
id:bean的id,在一个容器中,id值唯一的classs可以通过id值获得相应的bean:bean的类型,即配置bean的全路径类名
范例
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
然后我们来介绍一下bean的别名:
类别
描述
名称
name
类型
标签
所属
bean标签
功能
定义bean的别名,可以定义多个,使用逗号,分号,空格分隔
范例
<bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl">
一般情况下,使用id和name都可以获得bean,但是建议使用唯一的id
无论是通过id还是name获得bean,如果找不到bean,就抛出异常NosuchbeanDefinitionException。
最后,我们来介绍一下bean的作用范围scope:
类别 描述 名称scope
类型 标签 所属 bean标签 功能 定义bean的作用范围,可选范围如下:singleton:单独列(默认)prototype:非单列 范例<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
这里的scope是指生成对象的数量
默认情况下,我们的scope是singleton,因为许多对象只需要创建一次,多次创建会导致内存膨胀。
bean适合交给容器进行管理(singleton):
业务层对象数据层对象对象的对象
bean不适合交给容器进行管理(prototype):
包装实体的域对象(带状态的bean)
/blockquote>bean实例化
bean的实例化通常分为四种方法,我们在下面逐一介绍:
ol start='1' style='text-align: justify;'>
在配置条件下,我们需要在数据类中提供结构方法
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
如果不存在参结构方法,则抛出异常Beancreationexception
/blockquote>
ol start='2' style='text-align: justify;'>
在之前的案例中,我们有一个对象工厂的说法,我们可以设立工厂,并调用它的方法来获得bean
ol start='3' style='text-align: justify;'>
和静态工厂一样,但不同的是方法不是静态的,我们需要提前创建一个bean
ol start='4' style='text-align: justify;'>
除了我们之前定义的工厂外,Spring还提供了FactoryBeann的官方版本
bean生命周期先接单介绍生命周期的相关概念:
- 生命周期:从创造到消亡的完整过程
- bean生命周期:bean从创建到销毁的整个过程
- bean生命周期控制:在bean创建后到销毁前做点什么
接下来,我们将介绍生命周期控制方法:
ol start='1' style='text-align: justify;'>
在xml配置文件中设置由数据层提供的方法
ol start='2' style='text-align: justify;'>
Spring为创建提供了两个接口,我们只需要继承和实现这种方法
我们需要提到bean的销毁时机:(了解)
- 因为默认情况下,我们的bean不会被销毁,因为虚拟机会直接退出,claspathXmlaplicationcontext将被忽略
因此,要想销毁bean观察到destroy的实现,就需要手动关闭:
ol start='1' style='text-align: justify;'>
ol start='2' style='text-align: justify;'>
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
最后统计一下整个生命周期:
初始化容器:创建对象(内存分配)->实施结构方法->执行属性注入(set操作)->使用bean执行bean初始方法:执行业务操作关闭/销毁容器:执行bean销毁方法
/blockquote>依赖于注入方式
首先,我们需要知道有两种方法可以在类中传输数据:
- 普通方法(Set)
- 构造方法
然后我们应该知道,数据的类型一般分为两种:
- 引入类型(数据层)
- 简单类型(基本数据类型和String)
因此,我们将依赖注入分为四种方式:
- 注入简单类型的setter引用类型
- 注入简单类型的介绍类型的结构器
首先,我们需要在bean中定义简单的类型属性,并提供可访问的set方法
然后使用property标签value属性在配置中注入简单的数据类型
setter注入引用类型首先,我们需要定义bean中引用的类型属性,并提供可访问的set方法
然后在配置中使用property标签ref属性注入引用类型数据
注入简单类型的构造器(理解)在bean中定义简单的类型属性并提供可访问的set方法
constructorarg标签value属性在配置中注入简单类型的数据
引用类型(理解)注入构造器在bean中定义引用类型属性并提供可访问的结构方法
使用constructorarg标签ref属性在配置中注入简单类型的数据
参数配置问题(理解)注入构造器我们已经介绍了构造器的注入方法
但是,如果我们在bean中更改数据名称,配置将不再适应,因此提供了一些解决参数配置问题的方法:
- constructorarg标签type属性设置在配置中
- constructorarg标签index属性设置在配置中
以下选择标准取决于注入方式:
ol start='1' style='text-align: justify;'>
依靠自动装配
之前我们已经学会了手动注射的方法,但是Spring实际上为我们提供了一种依赖自动装配的语法:
- 根据bean所依赖的资源,物联网容器在容器中自动搜索并注入bean的过程称为自动组装
自动装配方式:
- 按类型(常用)按类型(常用)
- 按名称
- 按构造方法
- 不启用
自动装配语法:
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
依靠自动装配的特点:
自动组装用于注入引用类型,不能按类型操作简单类型(byType)必须保证容器中相同类型的bean是唯一的,建议按名称组装时使用(byName)必须确保容器中有指定名称的bean。由于变量名与配置耦合,不建议使用低于setter注入和构造器注入的自动组装优先级。同时出现时,自动装配配置失效
/blockquote>依靠集合注入
除了基本类型和介绍类型外,我们有时还需要注入集合
下面我们简单介绍一下结合注入:
案例:数据源对象管理对于一个新的数据源对象,我们使用两个步骤来创建bean(我们以druid为例):
- 导入druid坐标
- 作为Spring管理的beang,配置数据源对象
本案例将介绍如何加载properties文件,并将文件带入property的基本信息
我们大致将步骤分为以下三个步骤:
- 开辟context命名空间:
- 使用context命名空间加载指定的properties文件
- 使用${}读取加载的属性值
除上述基本操作外,我们在使用context命名空间时还需要注意很多点:
- 不加载系统属性
- 加载多个properties文件
- 加载所有properties文件
- 标准格式加载properties
- 搜索从类路径或jar包中加载properties文件
bean和依赖注入的相关知识学习已经完成,接下来我们主要学习IOC容器中的核心容器。
这里提到的核心容器可以简单理解为ApplicationContext。接下来,我们将从以下问题入手,学习以下容器的相关知识:
- 如何创建容器?
- 创建容器后,如何从容器中获取bean对象?
- 容器的层次结构是什么?
- 什么是BeanFactory?
Aplicationcontext的创建方式为(XML配置文件在类路径下):
除此之外,Spring还提供了另一种创建方法(文件的绝对路径):
获取Bean的三种方式方法一是在当前案例中获取的方法:
这种方法的问题是,每次获得时都需要转换类型
方式二:
这种方法可以解决类型强转问题,但增加了另一个参数,相对没有简化多少。
方式三:
这种方法类似于我们之前学到的依赖注入的类型注入。必须确保IOC容器中只有一个与此类型对应的bean对象。
容器层次结构下面我们给出容器的层次图
用BeanFactory创建IOC容器的具体实现方法如下:
为了更好地看到BeanFactory和ApplicationContext之间的区别,在BookDaoimpl中添加以下结构函数:
如果不获得bean对象,打印会发现:
- beanFactory是延迟加载,只有在获得bean对象时才会创建
- Applicationcontext是立即加载的,容器加载时会创建bean对象
- 如果Applicationcontext想要成为延迟加载,只需按以下方式进行配置
- <?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"> <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" lazy-init="true"/> </beans>
接下来,我们对以往知识进行总结,包括以下内容:
容器相关- BeanFactory是IoC容器的顶层接口,当BeanFactory对象初始化时,Bean延迟加载
- Applicationcontext接口是Spring容器的核心接口,bean在初始化时立即加载
- Applicationcontext接口提供基本的bean操作方法,并通过其他接口扩展其功能
- Applicationcontext接口常用于初始ClaspathXmlaplicationcontext(常用)FileSystemXmlApplicationContext
在上述开发中,xml配置文件的形式仍然有点复杂
此时,我们需要充分发挥Spring的优势:简化开发,通过注释简化开发过程
下面,我们将在多个方面逐步将Bean转化为注释
注释开发Bean在之前的内容中,我们的bean在xml配置文件中组装
在后期,我们的bean可以以注释的形式直接在实现类中注释
我们使用@component定义bean,可以添加参数来表示id,也可以不添加参数。后期我们使用class类型进行匹配
@Componenty延伸了三种类型,在实现方法上是一致的,但可以用于各种类型(仅用于自我识别)
- @Controller:用于定义表层bean
- @Service:用于业务层bean定义
- @Repository:用于定义数据层
但是,在上述情况下,即使我们将@component类定义为beannt,
我们的xml文件无法检测到,因此我们需要配置相关的扫描组件来扫描bean
纯注解开发我们前面提到的注释开发属于2.5的附属版本
在Spring3.0版本中,Spring提供了纯注释开发模式,用java代替配置文件,开启了Spring快速开发时代
以前,我们的xml配置文件非常繁琐:
但是,我们可以通过创建单独的类来表示配置文件:
- @Configuration:目前用于声明Spring配置类别
- @ComponentScan:用于扫描文件(类似于<context:component-scan base-package="com.itheima"/>)
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
注:由于这类属于配置类,我们通常单独列出一个文件夹来表示
常用文件夹:config
命名规范:SpringConfig,UserConfig...
/blockquote>
由于我们的开发不再依赖于xml配置文件,Spring容器在主函数中的获取方式也发生了变化:
注释开发Bean的范围和管理由于我们的Bean开发已经从xml转移到注释开发,一些配置设置也发生了变化
首先介绍Scope范围的设置方法:
- @Scope:定义bean的作用范围
然后我们介绍一下bean生命周期的init和destroy操作:
- @PostConstruct:定义init操作,表示构造后操作
- @PreDestroy:定义destroy操作,表示销毁前操作
在Spring3.0中,省略了以前繁琐的依赖注入,我们的bean依赖注入只留下自动组装操作:
- 使用@Autowired注释打开自动组装模式(按类型)
- 当有相同类型时,我们使用@Qualifier打开按名自动组装
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
注:基于反射设计的自动组装创建对象,暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
注:建议使用无参结构方法创建对象(默认)。如果不提供相应的结构方法,请提供唯一的结构方法
注:@Qualifier是基于@Autowired实现的,必须保证Qualifier存在前有Autowired
/blockquote>
除上述bean类型组装外,我们的简单类型组装仍然存在:
- 我们以@Value的形式配置简单类型的值
之所以采用@Value的形式配置,是因为我们的类型值不一定是手动输入的,可能来自Properties资源:
- 首先,我们需要在Springconfig中配置相关资源
- 然后,当我们在数据层调用时,我们使用${}来匹配数据
在实际开发中,我们不仅需要管理自己的bean,有时还需要引进其他bean
让我们以Druid为例进行解释:
ol start='1' style='text-align: justify;'>
ol start='2' style='text-align: justify;'>
ol start='3' style='text-align: justify;'>
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
注:除上述介绍方法外,还有其他方法,但介绍方法属于主流,所以我们不介绍其他学校,感兴趣的学生可以咨询
/blockquote>注意第三方导入资源的开发
下面我们简单介绍一下我们的第三方bean也可能需要导入一些资源:
- 依赖注入的简单类型
- 依赖类型依赖注入
blockquote style='text-align: justify; line-height: 1.64; margin-top: 5px; margin-bottom: 5px; padding-left: 1em; margin-left: 0px; border-left: 3px solid rgb(238, 238, 238); opacity: 0.6;'>
引入类型注入只需为bean定义方法设置形参即可,容器将根据类型自动组装对象
/blockquote>
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/944.html