2024年java主流基础框架

java主流基础框架本文将介绍 Spring 的框架和本体内容 包括核心容器 注释开发 AOP 和事务等 所以简单说明一下 Spring 的必要性 Spring 技术是 JavaEE 开发的必备技能 企业开发技术选型率高达 90 Spring 有助于简化发展 降低企业级发展的复杂性 Spring 可以整合框架 有效整合其他技术 提高企业应用开发和运营效率 Spring 的核心内容 Ioc 技术 DI 技术 AOP 事务处理

大家好,我是讯享网,很高兴认识大家。



本文将介绍Spring的框架和本体内容,包括核心容器、注释开发、AOP和事务等。

所以简单说明一下Spring的必要性:

  • Spring技术是JavaEE开发的必备技能,企业开发技术选型率高达90%!
  • Spring有助于简化发展,降低企业级发展的复杂性
  • Spring可以整合框架,有效整合其他技术,提高企业应用开发和运营效率

Spring的核心内容:

  • Ioc技术
  • DI技术
  • AOP
  • 事务处理

Spring可以进行框架集成:

  • MaBatis
  • MyBatis-plus
  • Struts
  • Struts2
  • Hibernate

在下一篇文章中,我们将学习Spring的框架思想,学习Spring的基本操作,并结合案例掌握它

温馨提醒:在学习本文之前,请先学习Javaweb的相关内容

(HTTP,Tomcat,Servlet,Request,Response,MVC,Cookie,Session,Ajax,Vue等内容)

初识Spring

官网:Spring | Home

Spring的发展已经形成了一个开发生态系统,Spring提供了相当多的项目,每个项目都用于完成特定的功能

一篇文章带你掌握主流基础框架——Spring_业务层

常用的主流技术包括:

  • Spring Framework:Spring框架
  • Spring Boot:Spring简化代码开发
  • Spring Cloud:Spring分布设计
Spring FrameWork系统架构

在系统学习Spring之前,我们需要了解FrameWork系统的结构

  • Spring Framework是Spring生态系统中最基本的项目,也是其他项目的基础

一篇文章带你掌握主流基础框架——Spring_业务层_02

我们现在使用的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生成对象,并将其转换为从外部提供的对象
实现Spring思想

IoC(Inversion of Control)控制反转思想:

  • 使用对象时,由主动new创建对象转换为外部提供对象
  • 在此过程中,对象创建的控制权由程序转移到外部,称为控制反转

DI(Dependency Injection)依赖注入:

  • 在容器中建立Bean和Bean之间的依赖关系和整个过程,称为依赖注入

Spring技术实现了Ioc思想:

  • Spring提供了一个被称为物联网容器的容器,用作物联网思想的外部
  • 物联网容器负责创建、初始化等一系列工作。物联网容器中创建和管理的对象称为Bean

 

 

 

目的:完全解耦

  • IoC:使用IOC容器管理beann
  • DI:在IOC容器中绑定依赖关系的bean

最终效果:

  • 使用对象不仅可以直接从物联网容器中获得,还可以绑定已获得的Bean之间的依赖关系
IoC入门

首先,我们需要了解物联网的使用规则:

  1. IoC负责管理什么:Service和Dao
  2. 物联网容器是如何被管理对象告知的:(配置)
  3. 如何将管理对象交给物联网容器:(接口)
  4. 获得IoC容器后,如何获得Bean?:(接口方法)
  5. 使用Spring所需导入的坐标:(pom.xml)

以下是物联网入门的详细步骤:

  1. 在pommm创建Maven项目.将坐标导入xml

 

  1. 创建Spring.xml配置包(applicationContext.xml,XML在导入坐标后xml中更新)

 

  1. 主函数

 

DI入门

首先需要了解DI的使用规则:

  1. bean基于IOC管理
  2. 使用new形式在Service中创建Dao对象是否保留:(否)
  3. 要求Dao对象在Service中进入Service:(提供方法)
  4. 如何描述Service和Dao之间的关系:(配置)

以下是DI入门的详细步骤(基于IOC入门):

  1. 删除new方法

 

  1. 创建对象的set方法

 

  1. 创建Dao和Service之间的连接

 

Bean整体介绍

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;'>

  • FactoryBean(重要实用)
  • 除了我们之前定义的工厂外,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引用类型
    • 注入简单类型的介绍类型的结构器
    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;'>

  • 强制依靠使用结构器,使用setter注入有可能不注入,导致null对象出现
  • 可选依靠使用setter注入,灵活性高
  • Spring框架提倡使用结构器,大多数第三方框架以结构器注入的形式初始化数据,相对严格
  • 如有必要,可以两者并用,用结构器注入强制依赖注入,用setter注入可选依赖注入
  • 在实际开发中,根据情况分析,如果受控对象没有提供setter方法,则只能使用构造器注入
  • 尽量推荐settter注入自己开发的模块
  • 依靠自动装配

    之前我们已经学会了手动注射的方法,但是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文件

    本案例将介绍如何加载properties文件,并将文件带入property的基本信息

    我们大致将步骤分为以下三个步骤:

    • 开辟context命名空间:

     
    

    • 使用context命名空间加载指定的properties文件

     
    

    • 使用${}读取加载的属性值

     
    

    除上述基本操作外,我们在使用context命名空间时还需要注意很多点:

    • 不加载系统属性

     
    

    • 加载多个properties文件

     
    

    • 加载所有properties文件

     
    

    • 标准格式加载properties

     
    

    • 搜索从类路径或jar包中加载properties文件

     
    

    核心容器

    bean和依赖注入的相关知识学习已经完成,接下来我们主要学习IOC容器中的核心容器。

    这里提到的核心容器可以简单理解为ApplicationContext。接下来,我们将从以下问题入手,学习以下容器的相关知识:

    • 如何创建容器?
    • 创建容器后,如何从容器中获取bean对象?
    • 容器的层次结构是什么?
    • 什么是BeanFactory?
    创建容器的方法

    Aplicationcontext的创建方式为(XML配置文件在类路径下):

     
    

    除此之外,Spring还提供了另一种创建方法(文件的绝对路径):

     
    

    获取Bean的三种方式

    方法一是在当前案例中获取的方法:

     
    

    这种方法的问题是,每次获得时都需要转换类型

    方式二:

     
    

    这种方法可以解决类型强转问题,但增加了另一个参数,相对没有简化多少。

    方式三:

     
    

    这种方法类似于我们之前学到的依赖注入的类型注入。必须确保IOC容器中只有一个与此类型对应的bean对象。

    容器层次结构

    下面我们给出容器的层次图

    一篇文章带你掌握主流基本框架——Spring_业务层_03

    使用BeanFactory

    用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
    bean相关

    一篇文章带你掌握主流基础框架——Spring_spring_04

    依赖注入相关

    一篇文章带你掌握主流基础框架——Spring_业务层_05

    注解开发

    在上述开发中,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中配置相关资源

     
    

    • 然后,当我们在数据层调用时,我们使用${}来匹配数据

     
    

    注释第三方beann的开发

    在实际开发中,我们不仅需要管理自己的bean,有时还需要引进其他bean

    让我们以Druid为例进行解释:

    ol start='1' style='text-align: justify;'>

  • 首先是pom.Druid坐标导入xml
  •  
    

    ol start='2' style='text-align: justify;'>

  • 第三方Bean使用@Bean配置
  •  
    

    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>

    小讯
    上一篇 2024-12-31 12:44
    下一篇 2024-12-25 20:39

    相关推荐

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
    如需转载请保留出处:https://51itzy.com/kjqy/9745.html