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

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

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

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

🥉与这篇相关的文章:               

【JAVAEE框架】Mybatis项目起步讲解【JAVAEE框架】Mybatis项目起步讲解_程序猿追的博客-CSDN博客
【JAVAEE框架】Mybatis常用操作(CRUD)【JAVAEE框架】Mybatis常用操作(CRUD)_程序猿追的博客-CSDN博客
【JAVAWEB开发】基于Java+Servlet+Ajax+jsp网上购物系统设计实现【JAVAWEB开发】基于Java+Servlet+Ajax+jsp网上购物系统设计实现_程序猿追的博客-CSDN博客

目录

一、前言补充

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方法。

示例

    <resultMap id="brandResultMap" type="brand">
        <result column="A" property="A1"></result>
    </resultMap>

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

示例

<!--    mybatis中的标签association主要用于解决“有一个”类型的关系,它表示一个对象至少有一个关联对象。
比如一般情况下,每个人都一个身份证,可能有些人没有(比如黑户和婴儿),人和身份证的关系就可以使用association表示。-->

<!--collection主要是应对表关系是一对多的情况-->
    <resultMap id="smbmsUser" type="smbmsUser">
        <id property="id" column="id"></id>
        <association property="role" column="userrole" resultMap="smbmsRole"></association>
        <collection property="addresses" column="id" ofType="smbmsAddress" resultMap="smbmsAddress"></collection>
    </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中的一级缓存,这样做的目的是为了让缓存中存储的是最新的消息,避免脏读。)

关闭一级缓存

        <!--       设置一级缓存的作用范围是一条sql语句执行期间,执行完毕清空一级缓存-->
        <setting name="localCacheScope" value="STATEMENT"/>


2.2、二级缓存

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

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

开启二级缓存

        <!--全局开启二级缓存-->
        <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导入

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</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的前缀,如果后续使用的时候,直接就<aop: 如aop:config即可。这是xml namespace即xml命名空间的简称,主要用于引入一些.xsd文件(也就是说xmlns后面的连接就是连接到相应的.xsd文件网站的,.xsd文件里面有特定的配置,比如xmlns:aop="http://www.springframework.org/schema/aop"就是加载aop切面的),xmlns冒号后面的是这个.xsd的前缀,如果后续使用的时候,直接就<aop: 如aop:config即可。

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写入依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.22</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.22</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.22</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.3.22</version>
        </dependency>

新建实体类,user与adderss

User

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private String name;
    private int age;
    private Address address;

}

adderss

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Address {

    private String province;
    private String city;
    private String county;

}

applicationcontext.xml 配置

<?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-4.0.xsd">

	<bean id="Address" class="com.itxzw.model.Address">
		<property name="province" value="江西"/>
		<property name="city" value="南昌"/>
		<property name="county" value="青山湖"/>
	</bean>


	<bean id="User" class="com.itxzw.model.User">
		<property name="name" value="xzw"/>
		<property name="age" value="20" />
		<property name="address" ref="Address"/>
	</bean>
	

</beans>

编text类

    @Test
    public void text01(){

        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        Object user = context.getBean("User");

        System.out.println(user);

    }

效果

4、示例讲解

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

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

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

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

<property name="address" ref="address"/>

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

总结图

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

  • 51
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 44
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿追

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值