가장 이해하기 쉬운 ssm 프레임 워크 통합 설명

주위

  • MySQL 8.0.16

1 미 바티스

1.1 데이터베이스 구성 파일

jdbc.driver=com.mysql.cj.jdbc.Driver
# 如果使用mysql 6+,增加一个时区的配置
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=123456

com.mysql.jdbc.Driver 与 com.mysql.cj.jdbc.Driver?

  • com.mysql.jdbc.Driver는 mysql-connector-java 5에 있습니다.
  • com.mysql.cj.jdbc.Driver는 mysql-connector-java 6에 있습니다.

JDBC는 mysql 5에 연결합니다.

url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false

JDBC는 mysql 6에 연결합니다.

url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&?useUnicode=true&characterEncoding=utf8&useSSL=false

1.2 Mybatis 구성

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置数据源,交给 spring 去做-->
    <typeAliases>
        <package name="com.fyy.pojo"/>
    </typeAliases>

    <mappers>
        <mapper class="com.fyy.dao.BookMapper"/>
    </mappers>
</configuration>

typeAiases 태그의 기능은 무엇입니까?

이 중 <typeAiases> 태그의 기능은 Java 유형에 대한 짧은 이름을 지정하는 것 뿐이며 xml 구성에만 관련되어 있으며 그 중요성은 클래스의 정규화 된 이름의 중복성을 줄이는 것입니다.

패키지 이름을 지정하면 Mybatis는이 패키지 이름 아래에서 필요한 Java Bean을 검색하고이 패키지 아래의 각 Java Bean은 설명이없는 경우 Bean의 첫 번째 문자의 규정되지 않은 클래스 이름을 소문자로 사용합니다. 다음과 같은 별칭 : com.fyy.pojo.User의 별칭 : user, 주석이있는 경우 별칭은 주석 값입니다. 다음 예 :

@Alias("hello")
public class Hello(){
    
    }

매퍼 태그는 무엇을합니까?

Mybatis는 Sql 매핑 구성을 기반으로하는 프레임 워크입니다. Sql 문은 Mapper 구성 파일에 있습니다. SqlSession 클래스를 빌드 한 후 Mapper 구성 파일에서 SQL 구성을 읽어야합니다.

매퍼 : Mybatis에게 가장 좋은 방법으로 매핑 파일을 찾을 위치를 알려주는 매퍼는로드해야하는 SQL 매핑 구성 파일 경로를 구성하는 데 사용됩니다.

매퍼 아래의 각 매퍼는 독립적 인 매핑 구성 파일의 경로로 구성된 매퍼이며 구성 방법은 다음과 같습니다.

1. 인터페이스가있는 패키지

<mappers>
	<!-- mapper接口所在的包名 -->
	 <package name="com.fyy.mapper"/>
</mappers>

# package标签,通过 name 属性指定 mapper 接口所在的包名,此时对应的映射文件必须
与接口位于同一路径下,并且名称相同。

2. 상대 경로 구성

<mappers>
   	<mapper resource="com/fyy/mapper/FlowerMapper.xml"/>
</mappers>


# mapper标签,通过 resource 属性引入 classpath 路径的相对资源

3. 수강 신청 소개

<mappers>
  	<mapper class="com.fyy.mapper.FlowerMapper"/>
</mappers>

# mapper 标签,通过 class 属性指定 mapper 接口名称,此时对应的映射文件必须与接口位于同一路径
下,并且名称相同

4. 가져올 URL 절대 경로 사용 (권장하지 않음)

<mappers>
	<mapper url="file:///var/mappers/UserMapper.xml"/>
</mappers>

# mapper 标签,通过 url 引入网络资源或者本地磁盘资源

요약하자면

Mapper 정보가 설정되었을 때만 Mybatis는 Mapper 설정 파일을로드 할 위치를 알고 있으며, 개발 중에는 프로젝트에서 Mapper의 설정 환경 설정에 따라 통합 설정 파일의 설정 방법을 선택합니다.


2 Spring은 Mybatis를 통합합니다.

2.1 Spring은 dao 레이어를 통합합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!--    配置整合Mybatis-->
    <!--1、关联数据库配置文件-->
    <context:property-placeholder location="classpath:database.properties"/>

    <!--2、连接池-->
    <!--数据库连接池
    dbcp 半自动化操作 不能自动连接
    c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 配置连接池属性 -->
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- c3p0连接池的私有属性 -->
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
        <!-- 关闭连接后不自动commit -->
        <property name="autoCommitOnClose" value="false"/>
        <!-- 获取连接超时时间 -->
        <property name="checkoutTimeout" value="10000"/>
        <!-- 当获取连接失败重试次数 -->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>

    <!-- 3.配置SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>

    <!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value="com.fyy.dao"/>
    </bean>
</beans>

2.1.1 context : property-placeholder 태그의 기능은 무엇입니까?

개발 중 일부 매개 변수는 url, password, username 및 데이터베이스에 연결하기위한 기타 정보와 같은 상수이며, 자주 변경할 필요는 없지만 다른 단계에서 변경해야합니다. 한 단계에서 자주 작성하지 않도록하는 솔루션이 있습니까? 매개 변수의 값이지만 매개 변수의 구성 정보는 여러 단계간에 편리하게 전환 할 수 있습니다.

솔루션 : Spring 3는 content : property-placeholder 요소 인 위의 문제를 쉽게 해결할 수있는 방법을 제공합니다.

content : property-placeholder 태그에서 속성 localtion을 사용하십시오. 값은 파일 경로이며 classpath :를 사용하여 파일 이름을 지정할 수 있습니다. 여기에서 데이터베이스 구성 정보를 연결합니다.

하나의 context : property-placeholder 만 Spring 컨테이너에 정의 될 수 있으며 나머지는 무시됩니다.

2.1.2 데이터베이스 연결 풀

데이터베이스 연결이 생성 될 때마다 막대한 리소스 소비가 발생하므로 데이터베이스 연결 풀 및 일련의 연결 관리 전략 수립을 통해 연결 재사용을 통해 데이터베이스 연결을 효율적이고 안전하게 재사용 할 수 있습니다. 이렇게하면 데이터베이스 연결 풀을 자주 설정하고 닫는 오버 헤드가 줄어 듭니다.

连接池的本质:介于 Java 和 JDBC 之间的 Java jar 包!

첫 번째 단계에서는 데이터베이스 구성 정보를 연결하고 Bean 태그를 사용하여 구성 정보를 얻습니다.

프로젝트의 실제 개발에 따라 연결 풀의 최대 및 최소 수, 연결 종료 후 자동 커밋 여부, 연결 제한 시간 가져 오기, 연결 실패 재시도 횟수 가져 오기 등 여러 속성을 구성 할 수 있습니다. 여기서 반복하지 않겠습니다.

2.1.3 SqlSessionFactory 개체 구성

SqlSessionFacoty의 역할은 SqlSession을 생성하는 것입니다. SqlSession은 JDBC의 Connection 객체에 해당하는 세션입니다. 응용 프로그램이 데이터베이스에 액세스 할 때마다 SqlSession은 SqlSessionFactory를 통해 생성되어야합니다. 따라서 SqlSessionFacoty는 Mybatis의 전체 수명주기에 하나만 있어야하며 각 데이터베이스에 해당해야합니다. SqlSessionFacoty.

전체 Mybatis 실행 프로세스에서 SqlSessionFacoty의 역할은 다음과 같습니다.
여기에 사진 설명 삽입
SqlSessionFactory 개체를 구성 할 때 데이터베이스 연결 풀을 여기에 삽입 한 다음 mybatis 전역 구성 파일을 구성합니다.
내 이해는 SqlSessionFactory에서 데이터베이스에 연결하기 위해 SqlSession을 만들 때 데이터베이스 연결 풀 및 데이터 소스의 정보를 알아야합니다.

2.1.4 scan dao 인터페이스 패키지 구성

MapperScannerConfigurer는 Mapper 인터페이스 생성 프록시를 Spring 컨테이너에 자동으로 스캔하여 주입합니다 .Mybatis는 Spring과 통합 할 때 Mapper 인터페이스 프록시를 생성하도록 MapperFactoryBean을 구성합니다. basePackage 속성을 사용하면 매퍼 인터페이스 파일에 대한 기본 패키지 경로를 설정할 수 있습니다. 세미콜론 또는 쉼표를 구분자로 사용하여 둘 이상의 패키지 경로를 설정할 수 있습니다. 각 매퍼는 지정된 패키지 경로에서 반복적으로 검색됩니다. . MapperScannerConfigurer가 MapperFactoryBean을 생성 한 다음 자동 어셈블하기 때문에 SqlSessionFactory 또는 SqlSessionTemplate을 지정할 필요가 없습니다.하지만 둘 이상의 DataSource를 사용하면 자동 어셈블리가 실패 할 수 있습니다. 이 경우 sqlSessionFactoryBeanName 또는 sqlSessionTemplateBeanName 특성을 사용하여 사용할 올바른 Bean 이름을 설정할 수 있습니다.

광범위한 언어 이해 : dao 레이어 인터페이스를 스캔하면 MapperScannerConfigurer가 각 인터페이스에 대한 인터페이스 프록시를 자동으로 생성하고이 인터페이스 프록시는 인터페이스의 구현 클래스이며 Spring 컨테이너에 삽입됩니다.

2.2 Spring은 서비스 계층을 통합합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 扫描service相关的bean -->
    <context:component-scan base-package="com.fyy.service" />

    <!--BookServiceImpl注入到IOC容器中-->
    <bean id="BookServiceImpl" class="com.fyy.service.BookServiceImpl">
        <property name="bookMapper" ref="bookMapper"/>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

事务管理器:DataSourceTransactionManager

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。

其中 配置文件声明事务,是将数据库连接池注入到 事务管理器中。关于注解方式声明事务,就不在这里做过多介绍,后期会单独拿出来分享Spring事务。


3 整合 SpringMVC

web.xml 配置文件

3.1 web.xml 文件是如何执行的?

3.1.1 执行顺序

访问顺序为:1->2->3->4,其中 2 和 3 的值必须相同。

url-pattern标签代表当一个请求发送到 servlet 容器时,容器会先将请求的 url 减去 当前应用上下文的路径作为 servlet 的映射 url,比如我访问的是 http://localhost/test/aaa.html,我的应用上下文是 test,容器会将 http://localhost/test 去掉,剩下的 /aaa.html 部分拿来做 servlet 映射匹配。如果与 设置的 url-pattern 映射匹配成功,请求才会被 DispatcherServlet 处理。图中的 <url-pattern> 中的值为:/,代表所有请求都会被处理。

而被DispatcherServlet 处理前,还会经过 2 ,3 步骤,url 匹配成功后,这个 url 访问名为 servlet-name 中值的 servlet,两个 servlet-name 值必须相同,因为 servlet 标签中的 servlet-name 标签映射到 servlet-class 标签中的值,最终访问 servlet-class 标签中的 DispatcherServlet 类,此时,请求才会被 DispatcherServlet 处理。

3.1.2 init-param标签

图中 \标签中的 \标签作用是,设置 springmvc 配置文件位置以及名称,springmvc配置文件不设置默认位置是:webapp,可以使用 classpath 设置文件的名称为:spring-mvc.xml ,代表 springmvc 配置文件名必须为 spring-mvc.xml,如不使用 classpath 设置其路径及名称,默认在 webapp下,名称为:\标签中的值 + "-servlet.xml",例如:如 标签中值为:springmvc,则默认的 springmvc 配置文件名为:springmvc-servlet.xml

3.1.3 load-on-startup标签

图中 \标签作用是,设置 servlet加载时间,如不设置默认在第一次请求访问时加载 servlet,若设置此标签值为正整数,会将 servlet 的加载时间提前到项目启动时,此标签中可以写整数,但写负整数和0和没有设置是一样的效果,只有设置为正整数才会将 servlet 的加载时间提前到项目启动时,也就是 tomcat 启动时,值越小,代表优先级越高。

3.2 springmvc 配置文件是如何执行的?

spring-mvc.xml 配置文件

3.2.1 mvc:annotation-driven作用?

springmvc注解驱动会自动注册:DefaultAnnotationHandlerMapping 与 AnnotationMethodHandlerAdapter 两个bean,这两个 bean 是 SpringMVC 为 @Controller 分发请求所必须的,解决了使用 @Controller 注解的前提配置。

在 Spring MVC 3.1 以上:

  • DefaultAnnotationHandlerMapping 变更为:RequestMappingHandlerMapping
  • AnnotationMethodHandlerAdapter 变更为:RequestMappingHandlerAdapter
通常如果我们希望通过注解的方式来进行 SpringMVC开发,我们会在 springmvc 配置文件中使用 注解驱动:\,那这个标签做了什么?通过寻找源码,找到注解驱动的实现类是:org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

我们来看看这个类主要做了什么工作?

AnnotationDrivenBeanDefinitionParser类向工厂中注册了几个 bean 实例,其中包括:

  • RequestMappingHandlerMapping
  • BeanNameUrlHandlerMapping
  • RequestMappingHandlerAdapter
  • HttpRequestHandlerAdapter
  • SimpleControllerHandlerAdapter
  • ExceptionHandlerExceptionResolver
  • ResponseStatusExceptionResolver
  • DefaultHandlerExceptionResolver

上面的bean实例都是做什么的呢?

前两个 bean 是 HandlerMapping 接口的实现类,用来处理请求映射的。其中第一个处理是 @RequestMapping 注解的,第二个是将 controller 类的名字映射为 请求 url,中间三个 adpter 是用来处理请求的,具体说就是确定调用哪个 controller 的哪个方法来处理当前请求,第一个处理 @Controller 注解的处理器,支持自定义方法参数和返回值,第二个是处理继承 HttpRequestHandler 的处理器,第三个处理继承自 Controller 接口的处理器,后面三个是用来处理异常的解析器。

结论

如果使用@Controller 注解,没有配置注解驱动: <mvc:annotation-driven> 的话,那么所有的请求都无法找到 DispatcherServlet ,并无法把请求分发至控制器。添加注解驱动后,才会扫描所有带有 @Controller 注解的类,由 spring 管理并维护。

3.2.2 mvc:default-servlet-handler作用?

还记得我们在 web.xml 中配置了 url-pattern,用来过滤请求,SpringMVC 将接收到的所有请求都看做是一个普通请求,包括对于静态资源的请求,这样一来,所有对于静态资源的请求都会被看做是一个普通的后台控制器请求,而静态资源的请求会因为找不到资源而报404异常。查看 tomcat 日志就可以看到会有警告。

여기에 사진 설명 삽입

对于此问题 SpringMVC 在全局配置文件中提供了一个 <mvc:default-servlet-handler>标签,在 web 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler ,它会对 DispatcherServlet 请求进行处理,如果该请求已经做了映射,那么会接着交给后台对应的处理程序,如果没有映射,就交给 web 应用服务器默认的 servlet 处理,从而找到对应的静态资源,只有找不到静态资源时会报错。

如果默认的 Servlet 容器不用默认的 default ,用不同名称进行自定义配置,或者在缺省 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则必须显示提供默认 Servlet 的名称。

<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>

3.2.3 context:component-scan 作用?

扫描组件,将所有使用 @Controller 注解的类作为 SpringMVC 的控制层。其中 base-package 属性是指定扫描的包。

3.2.4 视图解析器 作用?

视图解析器,是将 prefix + 视图名称 + suffix = 确定最终要跳转的页面,其中视图名称是什么?? 处理请求的方法会返回一个字符串,这个字符串即视图名称,最终会通过配置文件中配置的视图解析器实现页面的跳转。例如:
@Controller
public class TestController {
    
    
    @RequestMapping("hello")
    public String hello() {
    
    
        System.out.println("success");
        return "success";
    }
}

# 其中返回字符串为:success,所以处理此请求最终要跳转的页面为:/WEB-INF/view/success.jsp

SpringMVC에 대한 설명은 Xiaobian의 다른 기사를 볼 수 있습니다. 기본에서 소스 코드까지 SpringMVC


4 Spring 구성 통합 파일

<?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">

    <import resource="classpath:spirng/spring-dao.xml"/>
    <import resource="classpath:spirng/spring-service.xml"/>
    <import resource="classpath:spirng/spring-mvc.xml"/>
</beans>
Spring의 핵심 구성 파일 인 applicationContext.xml은 구성 파일을 통해 이름을 수정할 수도 있습니다. 구성 파일을 읽을 때 클라이언트에 새 ApplicationContext 인스턴스를 만들 때이 구성 파일이로드됩니다. 일반적으로 사용되는 ApplicationContext 구현 클래스는 다음과 같습니다.
  • ClassPathXmlApplicationContext
  • ClassPathResource
  • XmlWebApplicationContext
  • FileSystemXmlApplicationContext
그 중에서 \는 구성 정보를 더 명확하게 만들고 디커플링 효과를 얻기 위해 가져 오기를 통해 여러 구성 파일을 통합하는 것입니다.

종료

위는 ssm 프레임 워크 구성에 대한 제가 연구 한 내용을 요약 한 것입니다. 어떤 곳은 충분히 깊지 않지만 초보자들에게는 꽤 보람이있을 것입니다. 오류가 있으면 수정 해주세요!

추천

출처blog.csdn.net/weixin_42653522/article/details/108624967