• 【JAVAEE框架】Spring 项目构建流程


     哈喽~大家好呀,这篇来看看Spring 项目起步讲解。

     🥇个人主页:个人主页​​​​​                

    🥈 系列专栏:【Java EE框架】

    🥉与这篇相关的文章:               

    目录

    一、前言补充

    1、ResultMap 映射。

    2、Mybatis一级缓存二级缓存

    2.1、一级缓存

    2.2、二级缓存

    二、Spring 核心概念

    1、介绍

    2、优点

    3、体系结构

    三、快速使用

    1、applicationcontext.xml 作用

    2、详细讲解

    2.1、beans

    2.2、xmlns

    2.3、xsi:schemaLocation

    2.4、bean标签

    2.5、property标签

    3、代码示例

    4、示例讲解


    一、前言补充

    1、ResultMap 映射。

    补充上篇 Mybatis 的——ResultMap,在 JavaWeb项目中使用了 ResultMap 没做具体的讲解。

    当实体类的成员变量与 DB 字段名对不上时,使用 resultMap 映射。

    什么意思?

    实体类的成员变量的变量名是A, DB 字段名是A1,连接 DB 时由于名称对不上,页面就不会显示数据,所以,使用 ResultMap 映射,解决此类问题

    1、属性说明

    • id属性 ,resultMap标签的标识。
    • type属性 ,返回值的全限定类名,或类型别名。
    • autoMapping属性 ,值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在resultMap内明确注明映射关系才会调用对应的setter方法。

    示例

    1. <resultMap id="brandResultMap" type="brand">
    2. <result column="A" property="A1">result>
    3. resultMap>

    扩:当我们对多表操作的时候,表与表之间可能会出现对不上的情况,这时需要使用 association 与 collection

    示例

    1. <resultMap id="smbmsUser" type="smbmsUser">
    2. <id property="id" column="id">id>
    3. <association property="role" column="userrole" resultMap="smbmsRole">association>
    4. <collection property="addresses" column="id" ofType="smbmsAddress" resultMap="smbmsAddress">collection>
    5. resultMap>

    2、Mybatis一级缓存二级缓存

    2.1、一级缓存

    Mybatis 的一级缓存是指 Session 缓存。一级缓存的作用域默认是 SqlSession 。Mybatis默认开启一级缓存。
    在同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中;第二次以后则直接去一级缓存中取。
    当执行的SQL查询中间发生了增删改的操作,mybatis 会把 SqlSession 的缓存清空。
    意思是说:执行相同的操作,第一次会把结果写到缓存中,第二次执行时直接从缓存拿数据,Mybatis默认开启一级缓存

    一级缓存失效的情况:

    1、SqlSession不同;
    2、SqlSession相同,查询条件不同。因为缓存条件不同,缓存中还没有数据。
    3、SqlSession相同,在两次相同查询条件中间执行过增删改操作。
    4、SqlSession相同,手动清空了一级缓存。(如果SqlSession去执行commit操作(执行插入。更新、删除),清空SqlSession中的一级缓存,这样做的目的是为了让缓存中存储的是最新的消息,避免脏读。)

    关闭一级缓存

    1. <setting name="localCacheScope" value="STATEMENT"/>


    2.2、二级缓存

    Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个nameSpace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
    一个会话,查询一条数据,这个数据会被放在当前会话的一级缓存中;如果会话被关闭了,一级缓存汇总的数据会被保存到二级缓存。新的会话查询信息就会参照二级缓存。
    二级缓存的使用原则:

    1、只能在一个命名空间下使用二级缓存。由于二级缓存中的数据是基于nameSpace的,即不同nameSpace中的数据互不干扰。在多个nameSpace中若均存在对同一个表的操作,那么这多个nameSpace中的数据可能就会出现不一致现象。
    2、在单表上使用二级缓存。如果一个表与其他表有关联关系,那么就非常有可能存在多个nameSpace对同一数据的操作。而不同nameSpace中的数据互不干扰,所以就有可能出现多个nameSpace中的数据不一致现象。
    3、查询多于修改时使用二级缓存。在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。

    开启二级缓存

    1. <setting name="cacheEnabled" value="true"/>

    二、Spring 核心概念

    1、介绍

    Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术

    官网 : http://spring.io/

    官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/

    GitHub : https://github.com/spring-projects

    pom导入

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-webmvcartifactId>
    4. <version>5.2.0.RELEASEversion>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframeworkgroupId>
    8. <artifactId>spring-jdbcartifactId>
    9. <version>5.2.0.RELEASEversion>
    10. dependency>

    2、优点

    2.1、低侵入式设计
    2.2、独立于各种应用服务器
    2.3、依赖注入特性将组件关系透明化,降低了耦合度
    2.4、面向切面编程特性允许将通用任务进行集中式处理
    2.5、与第三方框架的良好整合

    3、体系结构

    组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

    • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
    • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
    • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
    • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
    • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
    • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
    • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring设计理念
    Spring是面向Bean的编程

    Spring 两大核心技术
    控制反转(IoC:Inversion of Control ) /依赖注入(DI:Dependency Injection )
    面向切面编程(AOP:Aspect Oriented Programming)

    三、快速使用

    1、applicationcontext.xml 作用

    我们学Spring的主要目的还是因为Spring能充当我们容器管理的作用,这个作用主要体现在:
    控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
    面向切面的编程(AOP): Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
    容器: Spring 包含并管理应用中对象的生命周期和配置。
    MVC框架: Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
    事务管理: Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
    异常处理: Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
    这里不详细讲解Spring框架,但作用大概就这几个,当然还有管理各类ORM框架等,不在这里讨论。
    由于applicationContext.xml文件 Spring的配置文件,所以applicationContext.xml的作用当然就是用来配置Spring框架所需的信息了。

    2、详细讲解

    2.1、beans

    applicationContext.xml文件的根元素,所有的内容都需要包含在beans的标签中。

    2.2、xmlns

    这是xml namespace即xml命名空间的简称,主要用于引入一些.xsd文件(也就是说xmlns后面的连接就是连接到相应的.xsd文件网站的,.xsd文件里面有特定的配置,比如xmlns:aop="http://www.springframework.org/schema/aop"就是加载aop切面的),xmlns冒号后面的是这个.xsd的前缀,如果后续使用的时候,直接就

    2.3、xsi:schemaLocation


    其中xsi是xmlns:xsi中的xsi,schemaLocation是http://www.w3.org/2001/XMLSchema-instance中的一个属性(了解即可,不需要深入),这个xsi:schemaLocation的作用就是帮你定位到对应的.xsd文件的。

    2.4、bean标签

    id属性:用于指定Bean的名称,在Bean被依赖时使用,在获取Bean时使用等

    name属性:用于指定Bean的别名

    class属性:用于指定Bean的来源,即创建要创建的Bean的class类(需要全限定名)

    singleton属性:用于指定当前Bean的创建模式,若值为true表示为单例模式,false表示原型模式(prototype)

    depends-on属性:用于指定当前Bean的依赖Bean,强制指定的Bean在当前Bean初始化之前先完成初始化

    init-method属性:用于指定当前Bean的初始化方法,在Bean实例创建好后,首先会调用其指定名称的方法

    destory-method属性:用于指定当前Bean的销毁方法,在Bean即将被销毁之前会自动调用该属性指定的方法

    lazy-init属性:用于指定当前Bean的初始化时间,若值为true表示在初次调用时才会自动创建实例并初始化,false表示在IoC容器创建的时候就会完成创建和初始化

    autowire属性:用于指定当前Bean的依赖关系的自动注入方式,其有五个值:

    byName值:表示通过id名称来自动匹配;

    byType值:表示通过class指定的类型来自动装配;

    constructor值:表示使用构造函数的参数进行自动装配(参数的类型匹配);

    autodetect值:表示自动进行选择匹配方式,首先进行constructor自动装配,若不存在构造方法则使用byType方式进行自动装配;

    no值:表示不适用自动装配。

    dependency-check属性:用于指定Bean的依赖检查模式,检查依赖关系是否完整,与自动装配合用,其有四个值:

    simple值:表示针对基本类型、字符串、集合进行依赖检查

    object值:表示对引用对象进行依赖检查

    all值:表示对基本类型、字符串、集合、引用对象全部进行依赖检查

    none值:表示不进行任何依赖检查,默认情况。

    2.5、property标签


    name属性:用于指定属性的名称,与类中的set方法后方的名称一致

    value属性:用于指定该属性的值,用于指定的值是基本类型、字符串类型

    ref属性:用于指定该属性的值,用于指定的值是引用对象类型(即其他的Bean),ref后面的值为另一个Bean的id

    value标签:用于指定属性的值,类型为基本类型、字符串类型,值为标签内的文本内容,可以使用null值将属性的值设置为null
     

    3、代码示例

    建个基础的 Maven 项目结构,在pom写入依赖

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-beansartifactId>
    4. <version>5.3.22version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframeworkgroupId>
    8. <artifactId>spring-contextartifactId>
    9. <version>5.3.22version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.springframeworkgroupId>
    13. <artifactId>spring-coreartifactId>
    14. <version>5.3.22version>
    15. dependency>
    16. <dependency>
    17. <groupId>org.springframeworkgroupId>
    18. <artifactId>spring-expressionartifactId>
    19. <version>5.3.22version>
    20. dependency>

    新建实体类,user与adderss

    User

    1. @Data
    2. @ToString
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. public class User {
    6. private String name;
    7. private int age;
    8. private Address address;
    9. }

    adderss

    1. @Data
    2. @ToString
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. public class Address {
    6. private String province;
    7. private String city;
    8. private String county;
    9. }

    applicationcontext.xml 配置

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans
    5. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    6. <bean id="Address" class="com.itxzw.model.Address">
    7. <property name="province" value="江西"/>
    8. <property name="city" value="南昌"/>
    9. <property name="county" value="青山湖"/>
    10. bean>
    11. <bean id="User" class="com.itxzw.model.User">
    12. <property name="name" value="xzw"/>
    13. <property name="age" value="20" />
    14. <property name="address" ref="Address"/>
    15. bean>
    16. beans>

    编text类

    1. @Test
    2. public void text01(){
    3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    4. Object user = context.getBean("User");
    5. System.out.println(user);
    6. }

    效果

    4、示例讲解

     bean 其实就是个容器,你要使用spring,我就在容器里面拿出来,你有我就拿,没有就是默认的初始值。

    bean 的 id 就是你这个容器的名字了,唯一且首字母小写,class就是你实体类的引用路径,property——> name 为 实体类里面的成员变量赋值(换句话讲,我先把值放到容器里面,你要用我就拿出来),这是基本数据类型的使用,如果我是引用数据类型呢?

    像user里面有address类的引用,这要如何赋值呢?

    我们容器申明id为address,然后在user里面使用ref引用进来

    "address" ref="address"/>

    property作用:Bean定义可以具有零个或多个属性。属性元素对应于bean类公开的JavaBean setter方法。 Spring支持原语,对相同或相关工厂中的其他bean的引用,列表,映射和属性。

    总结图

    不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!向着明天更好的自己前进吧!

  • 相关阅读:
    大数据之 Hadoop 教程
    odoo 开发入门教程系列-添加修饰
    C# 实现websocket双向通信
    gif动图表情包如何制作?教你一键生成gif表情包
    生成与调用C++动态链接库(so文件)
    TypeScript
    设计模式:责任链模式
    项目实战-经验复盘
    从人工测绘到无人机航测:探索测绘技术的巨大变革
    【JS函数】JS函数之高阶函数、组合函数、函数柯里化
  • 原文地址:https://blog.csdn.net/aasd23/article/details/126886086