当前位置:网站首页 > Java基础 > 正文

java主流基础框架



本文将介绍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>

    版权声明


    相关文章:

  • java基础string漫谈2025-04-26 19:26:06
  • java的基础总结2025-04-26 19:26:06
  • 零基础怎么学习java2025-04-26 19:26:06
  • java零基础自学书籍2025-04-26 19:26:06
  • java基础算法2025-04-26 19:26:06
  • 怎样扎实java基础2025-04-26 19:26:06
  • java基础教学2512025-04-26 19:26:06
  • java各种基础概念2025-04-26 19:26:06
  • java面试必备java基础篇2025-04-26 19:26:06
  • 什么是java基础2025-04-26 19:26:06