Spring系列一品境之金刚境

Spring系列复习(一)


相关导航
Spring系列一品境之金刚境


Spring金刚境导航


前言

本博文重在夯实Spring全家桶的知识点,回归书本,夯实基础,学深学精

Java相关基础已复习完毕,现在就到了Spring全家桶系列了,欲练神功,先固内功。之前做项目对Spring全家桶学的一知半解,好多基础概念都不清楚,正好借此机会梳理一下相关知识点。
参考书籍:《Spring In Action 5th EDITION》与《多线程与高并发 马士兵丛书》


 本博文主要归纳整理Spring全家桶的一系列概念、其AOP和IOC原理和常见注解

一、Spring全家桶学习路线

Spring全家桶
Spring容器
SpringMVC
SpringBoot
SpringCloud
SpringSecurity
其它组件
Mybatis-plus
Redis
RabbitMQ
Dubbo
云原生
反应式编程

1、 思维导图

请添加图片描述

二、系列基础概念梳理

1、Spring

  • Spring是一个开源的轻量级的Java开发框架,其中包括SpringMVC、SpringBoot、SpringCloud、SpringSecurity、反应式编程。

1.1 Bean

  • Bean是计算机自动生成的类,Bean是一个由Spring IOC容器实例化、组装和管理的对象
  • Bean并不是程序员编辑的,而是程序运行时,由Spring通过反射生成的
  • Spring通过依赖注入的方式来管理Bean之间的依赖关系

1.2 Injection(注入)

  • Spring注入可以理解为是对一个对象进行初始化,也就是省去new的这个步骤
  • 如果遇到修改,只需要改一处就行了。

1.3 DI(依赖注入)

  • Dependency Injection,是IOC的另一个名字,自动满足Bean之间的依赖
  • 是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性
  • 创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称为依赖注入

1.4 Spring ApplicationContext(应用上下文)

  • 又称之为容器(container)
  • 负责对象整个生命周期的管理(创建装配销毁
  • 可以简单理解为工厂,负责造对象的
  • 利用IOC设计思想,Spring的核心之一

:Spring的设计模式是工厂模式

1.4.1 IOC容器
  • 全称是 Inversion Of Control,是一种设计思想,控制反转
  • 开发者不需自己主动创建对象管理对象之间的依赖关系,即将控制权交给IOC容器,负责对象的创建、管理和销毁
  • 简单来说,对象需要的时候,就自动地生成对象,不用再去创建
  • 要容器造什么对象、对象之间有什么依赖关系是由开发者自己决定的,自动满足Bean之间的依赖
1.4.2 IOC容器类别
1)Spring BeanFactory容器
  • 最简单的容器,给DI提供了基本的支持
  • 移动设备中为了节省有限的资源,会被优先选择,即主要用于轻量级应用
  • 包 org.springframework.beans.factory.BeanFactory
2)Spring ApplicationContext容器
  • 在Spring BeanFactory容器的基础上,添加了更多企业特定的功能,也就是比BeanFactory更加优秀更加牛逼了。
  • 包 org.springframework.context.ApplicationContext

1.5 AOP(面向切面编程)

  • Aspect Oriented Programming,面向切面编程
  • 通过预编译方式和运行期动态代理实现程序功能统一维护的一种技术
  • 是Spring框架中的一个重要内容,是函数式编程的一种衍生范型
  • 业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低

  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice
  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
  • Target(目标对象):织入 Advice 的目标对象.。
  • Weaving(织入):将Aspect和其他对象连接起来, 并创建 Adviced object 的过程

在这里插入图片描述

1.6 Wire(装配)

  • 一种是将Bean和属性进行对应,即将属性装配在Bean中
  • 一种是IOC/DI,就是控制反转/依赖注入,自动满足Bean之间的依赖

1.7 Annotion(注解)

  • 注解(Annotation)为Java代码提供元数据
  • 注解的属性也叫做成员变量。注解只有成员变量,没有方法
  • 想像代码具有生命,注解就是对于代码中某些鲜活个体的贴上去的一张标签
  • 详情请戳这个博客

1.8 Servlet

  • Server Applet,服务程序
  • 运行在服务器上的一个小程序,用来处理服务器请求

1.9 微服务

  • 微服务是针对与单体架构而言的,是项目开发的一种架构
  • 微服务得从两个方面去理解,什么是"微"、什么是"服务"
  • 微,狭义来讲就是体积小,所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立功能单元,是用户可以感知最小功能集
  • 微服务的目的是有效的拆分应用,实现敏捷开发部署,使各种服务淞耦合
  • 对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。
  • 不适合业务非常底层的系统,如操作系统内核存储系统数据库系统
1.9.1 微服务设计原则
1)单一职责原则

每个微服务只需要实现自己的业务逻辑就可以了,比如订单管理模块,它只需要处理订单的业务逻辑就可以了,其它的不必考虑。

2)服务自治原则

每个微服务从开发、测试、运维等都是独立的,包括存储的数据库也都是独立的,自己就有一套完整的流程,我们完全可以把它当成一个项目来对待。不必依赖于其它模块。

3)轻量级通信原则

首先是通信的语言非常的轻量,第二,该通信方式需要是跨语言、跨平台的,之所以要跨平台、跨语言就是为了让每个微服务都有足够的独立性,可以不受技术的钳制。

4)接口明确原则

由于微服务之间可能存在着调用关系,为了尽量避免以后由于某个微服务的接口变化而导致其它微服务都做调整,在设计之初就要考虑到所有情况,让接口尽量做的更通用,更灵活,从而尽量避免其它模块也做调整。

1.10 Cloud Native(云原生)

请添加图片描述

  • 应用原生被设计在以最佳方式运行,充分发挥云的优势
  • 云原生代表着原生为云设计 ,即充分利用云资源以云上运行为最佳目标设计应用
  • 云的出现,可以在提供各种资源之外,还提供各种能力,从而帮助应用,使得应用可以专注于业务需求的实现
  • 非业务需求相关的功能都被移到云,或者说基础设施中去了,以及下沉到基础设施的中间件
  • 像虚拟化、弹性扩展、高可用、高容错性、自恢复这些都是云的基本属性,云原生作为一种云计算,这是所具备的第一层含义
    请添加图片描述
    请添加图片描述

三、SpringMVC(略)

  • SpringMVC解决了V与C的交互问题,M是Model,V是View,C是Controller,是MCV架构
  • 在SpringMVC中,只使用了1个DispatcherServlet接收所有的请求,然后进行分发到不同的Controller中的某个方法,从而,减少Servlet对象的数量
  • 主要是通过接收分发请求减少Servlet对象的数量

四、SpringBoot

1、定义

Spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动Spring项目。

2、特性

  • 快速开发Spring应用的框架
  • 内嵌Tomcat和 Jetty 容器,不需要单独安装容器,使用main方法就可以直接启动发布一个 Web应用
  • 简化 Maven 配置,通过继承parent构件 ,一站式引入需要的各种依赖(启动器),简化依赖管理【优化混乱的管理】
  • 通过约定大约配置的方式可以实现基于注解零配置思想【优化复杂的配置】
  • 和各种流行框架, Spring MVC , Mybatis , Spring Cloud 无缝整合

3、项目框架

3.1 基础框架

在这里插入图片描述

  • ① 直接用IDEA新建SpringBoot项目会默认生成的一些文件,根据个人查的资料是对于项目本身没用的,可以删除。
  • ②自动生成的SpringBoot启动类
  • ③自动生成的SpringBoot项目配置文件(或者是.yml文件格式),默认是空的,什么内容也没有,可以根据项目需求自行添加。
  • ④自动生成的项目test目录,写测试类时会用到。
  • ⑤项目的pom.xml文件,用来管理项目所有依赖。【进阶:可以利用parent来管理依赖】
3.1.1 启动类格式

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.PostConstruct;
import java.util.TimeZone;

@SpringBootApplication  //启动类注解
public class AdminApplication {  //启动类

    public static void main(String[] args) {  //main方法
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
        SpringApplication.run(AdminApplication.class, args);  //启动操作
    }

}

注:Spring Boot一般通过Maven构建工具管理项目,体现在pom.xml文件

3.2 解耦模块框架

以蘑菇博客为例,主要借助Maven的parent功能解耦。

3.2.1 Maven中pom.xml文件解析
  • Maven基本信息

<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>  
    //声明项目描述符遵循哪一个POM模型版本。
    //模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,
    //这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。
    <groupId>com.funtl</groupId>
    //公司或者组织的唯一标志,并且配置时生成的路径也是由此生成,
  //如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/trade
    <artifactId>itoken-dependencies</artifactId>
    //本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的
    <version>1.0.0</version>
    //本项目目前所处的版本号
    <packaging>war</packaging>
    //打包类型,可取值:pom , jar , maven-plugin , ejb , war , ear , rar , par等等
    <name>itoken dependencies</name>
    //项目的名称, Maven产生的文档用,可省略
    <url>www.funtl.com</url>
    //项目主页的URL, Maven产生的文档用 ,可省略
</project>
  • 依赖关系
<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      //同上
      <artifactId>Project-B</artifactId>
      //同上
      <version>1.0</version>
      //同上
      <scope>compile</scope>
      <optional>true</optional> <!-- value will be true or false only -->
    </dependency>
  </dependencies>
</project>


注意 <dependencies><dependencyManagement>的区别

  • <dependencies>
    相对于 <dependencyManagement>,所有声明在<dependencies>里的依赖都会自动引入,并默认被所有的子项目继承
  • <dependencyManagement>
    <dependencyManagement> 里只是声明依赖,并不实现引入

  • 继承关系
    通过<parent>实现
----父项目
<project>
  [...]
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.4</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  [...]
</project>


----子项目
[...]
<parent>
  <groupId>com.devzuz.mvnbook.proficio</groupId>
  <artifactId>proficio</artifactId>
  <version>1.0-SNAPSHOT</version>
  <relativePath>../ParentProject/pom.xml</relativePath>   
</parent>
[...]


relativePath默认为…/pom.xml,如果路径不一样需要手动指定

  • 聚合关系 用于将多个maven项目聚合为一个大的项目
    通过<modules>实现
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org.maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.park.mvnDemo.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>Account Aggregator</name>
    <modules>
        <module>account-email</module>
        <module>account-persist<module>
    </modules>
</project>

1)Maven内置属性
  • ${basedir} 项目的根目录(包含pom.xml文件的目录)
  • ${version} 项目版本
2)POM属性
  • ${project.build.sourceDirectory} 项目的主源码目录,默认为 src/main/java
  • ${project.build.testSourceDirectory} 项目的测试源码目录,默认为 src/test/java
  • ${project.build.directory} 项目构件输出目录,默认为 target/
  • ${project.outputDirectory}项目主代码编译输出目录,默认为 target/classes/
  • ${project.testOutputDirectory} 项目测试代码编译输出目录,默认为 target/test-classes/
  • ${project.groupId} 项目的 groupId
  • ${project.artifactId} 项目的 artifactId
  • ${project.version} 项目的 version,与${version}等价
  • ${project.build.fianlName} 项目打包输出文件的名称默认为"${project.artifactId}
    ${project.version}"
3.2.2 Maven的parent属性

可以分成多个目录进行解耦开发
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 主要可以分为基础功能模块工具组件管理端客户端辅助功能模块

  • 由于Maven的多模块聚合结构,父模块的<modules>记录着所有的子模块

  • 在每一个子模块中也都标明了自己的父模块配置信息

  • 父模块<modules>中记录了子模块的artifactId子模块<parent>也记录着父模块配置信息

  • 子模块中<parent>中的<relativePath>中记录的是父项目相对于子项目路径。这样的逻辑是,在构建子项目的时候首先根据相对路径找到父项目


子模块可以继承父模块的元素

  • groupId:项目组ID,项目坐标的核心元素
  • version:项目版本,项目坐标的核心元素
  • description:项目的描述信息
  • organization:项目的组织信息
  • inceptionYear:项目的创始年份
  • url:项目的URL地址
  • developers:项目的开发者信息
  • contributors:项目的贡献者信息
  • distributionManagement:项目的部署信息
  • issueManagement:项目的缺陷跟踪系统信息
  • ciManagement:项目的持续集成系统信息
  • scm:项目的版本控制系统信息
  • mailingLists:项目的邮件列表信息
  • properties:项目的依赖配置
  • dependencies:项目的依赖配置
  • dependencyManagement:项目的依赖管理配置
  • repositories:项目的仓库配置
  • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
  • reporting:包括项目的报告输出目录配置、报告插件配置等

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>
    <modules>
        <module>mogu_utils</module>
        <module>mogu_base</module>
        <module>mogu_xo</module>
        <module>mogu_admin</module>
        <module>mogu_web</module>
        <module>mogu_picture</module>
        <module>mogu_sms</module>
        <module>mogu_search</module>
        <module>mogu_monitor</module>
        <module>mogu_gateway</module>
        <module>mogu_zipkin</module>
        <module>mogu_spider</module>
        <module>mogu_commons</module>
    </modules>
3.2.3 Spring Boot层级介绍与使用

一般的项目模块中都有EntityMapperVOServiceController层。
其关系如下
在这里插入图片描述
其中,这张图还少个Entity层,是在Mapper层下面。

1)Controller层
  • 控制请求和响应,负责前后端交互,分发请求
  • Controller层主要调用Service层里面的接口实现控制具体的业务流程
  • 控制的配置也要在配置文件(yml或者properties文件)中进行

在这里插入图片描述

2)Service层
  • 业务逻辑层,主要进行业务逻辑的具体实现
  • 分为两种类,一个是Service接口类,是具体逻辑的接口
  • 一个是ServiceImpl类,是对Service接口的实现类,实现接口中的具体方法
  • Service的Impl(实现类)是把MapperService进行整合的文件

在这里插入图片描述
在这里插入图片描述

3)Mapper层
  • 又称DAO层,是数据持久化层,简单理解为对数据库进行增删改查操作
  • 和Service层相同,分为两种类,一种是Mapper接口类,主要是数据库操作的接口
  • 另一种是MapperImpl即接口实现类,但Mybatis使用Java动态代理接口不需要实现类,直接通过Mapper.XML文件进行配置实现类

在这里插入图片描述

4)VO层
  • Object值对象
  • 用于业务层之间的数据传递仅仅包含数据
  • 前端的需要的数据做一个整合,打包成一个,方便前端获取数据
  • 类中属性可以和数据库表中字段,也可以不同

在这里插入图片描述

5)Entity层
  • 称为实体层,和数据库中表进行映射与对应
  • 只有一个Entity类,有getter和setter方法
Entity书写规范
1.java中包和类的建立和书写:
   包名可以自己定义,但最好是全部小写;
   包下边的类与接口全部使用驼峰命名规则。
   (首字母要大写,第二个单词的首字母也要大写。)
    注意:要新建**类而不是包**,包名和类名之间用点隔开
    可以写为entity.Student
 2.实体类与数据库的映射关系:
    entity包下的**实体类**要全部保持和数据库的**表名一致**;
    类**属性值**要与数据库**字段**对应。
    特别说明: 数据库的名应该在application.yaml中配置,连接数据库。
 3.如果数据库有d_id,在字段中要改为**驼峰**命名。
 4.类中属性的书写:
     private string  name
     权限    类型   属性名
 5.设置get、set方法的快捷键为:Alt+Inser

在这里插入图片描述

4、配置文件

我们可以通过配置文件来更改那些自动配置的属性。SpringBoot启动时加载该配置文件。Springboot默认的全局配置文件有两个,一个是application.properties,另一个是application.yaml

4.1 application.yaml文件

格式
k:空格)v //表示一对键值对(空格必须有);属性和值也是大小写敏感;
如
spring: 
    profiles: 
        active: prod 
spring:
    profiles: dev 
    # 略去配置 
spring:
    profiles: test 
    # 略去配置
spring:
    profiles: prod 
    # 略去配置
4.1.1 参数详解
server:
  port: 8080
  //指定server的端口
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
    
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/vcd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
      username: root
      password: 123456
      //指定Spring 连接池来源(这个写完之后会提示你导入相应的maven依赖)
      max-active: 30
      min-idle: 5
      validation-query: SELECT 1 FROM DUAL
      max-wait: 10000
      min-evictable-idle-time-millis: 30000
      //设置连接池的连接数量、时间等属性
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      //连接的动作和设置prepareStatement
      filters: stat,wall,log4j2
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      web-stat-filter:
        enabled: true
        url-pattern: "/*"
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        url-pattern: "/druid/*"
        allow: 0.0.0.0
        reset-enable: false
        login-username: admin
        login-password: admin
        //加入扩展插件
 
  thymeleaf:
    cache: false # 开发时关闭缓存,不然没法看到实时页面
    mode: LEGACYHTML5 # 用非严格的 HTML
    servlet:
      content-type: text/html
     //模板渲染引擎配置

4.2 application.properties

相对于.yml文件,.properties文件使用属性赋值的方式进行配置文件的书写。

格式
属性(可多级,用.连接)=值
如
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secret

application.properties常用参数

5、各层常用注解

5.1 启动层

5.1.1 @SpringBootApplication

启动注解
@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan这三个注解

5.1.2 @SpringBootConfiguration
  • 继承@Configuration注解,主要用于加载配置文件
  • 标注当前类配置类
  • 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到Spring容器中,并且实例名就是方法名
5.1.3 @EnableAutoConfiguration
  • 开启自动配置功能
  • 帮助SpringBoot应用将所有符合条件的@Configuration配置加载到当前SpringBoot创建并使用的IOC容器。
5.1.4 @ComponentScan
  • 自动扫描并加载符合条件的组件或Bean定义,最终将这些Bean定义加载到容器中。
  • 通过basePackages等属性指定@ComponentScan自动扫描的范围

5.2 Controller层

5.2.1 @Controller
  • 控制器,处理Http请求。
  • 整体页面刷新提交的处理注解。
5.2.2 @RestController
  • 将方法返回的对象直接在浏览器上展示成json格式
  • 相当于@ResponseBody+@Controller合在一起的作用
5.2.3 @RequestBody
  • 通过HttpMessageConverter读取Request Body并反序列化为Object(泛指)对象
5.2.4 @RequestMapping
  • 将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上
5.2.5 @GetMapping
  • 将HTTP get请求映射到特定处理程序的方法
  • 简写:@GetMapping(value = “/say”)
5.2.6 @PostMapping
  • 将HTTP post请求映射到特定处理程序的方法注解
5.2.7 @PathVariable
  • 获取url中的数据
@Controller
@RequestMapping("/User")
public class HelloWorldController {
 
    @RequestMapping("/getUser/{uid}")
    public String getUser(@PathVariable("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}
5.2.8 @RequestParam
  • 获取请求参数的值
@Controller
@RequestMapping("/User")
public class HelloWorldController {
@RequestMapping("/getUser")
public String getUser(@RequestParam("uid")Integer id, Model model) {
    System.out.println("id:"+id);
    return "user";
}
5.2.9 @RequestHeader
  • 把Request请求header部分的值绑定到方法的参数上
5.2.10 @CookieValue
  • 把Request header中关于cookie的值绑定到方法的参数

5.3 注入Bean

5.3.1 @Autowired
  • @Autowired注解作用在构造函数、方法、方法参数、类字段以及注解上
  • @Autowired注解可以实现Bean的自动注入
5.3.2 @Component
  • 把普通Entity实例化到Spring容器中
  • @Component就是告诉Spring,我是Entity类,把我注册到容器中
5.3.3 @Bean
  • 一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里
  • 当Spring需要创建指定的一个对象时会调用被这个注解(@Bean)注解的方法

示例:Spring在需要自动创建Info对象时,自动调用这个方法。

@Configuration
public class BeanInit {
    /**
     * 测试@Bean的作用
     */
    @Bean(name = "info")
    public Info getInfo(){
        return new Info("gfagduis", 2343);
    }

    @Bean(name = "info1")
    public Info getInfo1(){
        return new Info("gfagdufasfdfdais", 2343);
    }
}

5.3.4 @Bean产生一个bean的方法
  • @Bean明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。
  • 支持别名@Bean(“xx-name”)
5.3.5 @Scope
  • 作用在上和方法上,用来配置 Spring Bean 的作用域
  • 它标识Bean作用域
属性介绍
value
    singleton   表示该bean是单例的。(默认)
    prototype   表示该bean是多例的,即每次使用该bean时都会新建一个对象。
    request     在一次http请求中,一个bean对应一个实例。
    session     在一个httpSession中,一个bean对应一个实例。
    
proxyMode
    DEFAULT         不使用代理。(默认)
    NO              不使用代理,等价于DEFAULT。
    INTERFACES      使用基于接口的代理(jdk dynamic proxy)。
    TARGET_CLASS    使用基于类的代理(cglib)

5.4 Service层

5.4.1 @Service
  • @Service是@Component注解的一个特例,作用在类上
  • @Service用于标注服务层组件,表示定义一个Bean
  • @Service注解作用域默认为单例
  • 使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
  • @Service使用时没有传参数,Bean名称默认为当前类的类名首字母小写
  • @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字

5.5 Entity层

5.5.1 @Entity
  • @Table(name ="数据库表名"),这个注解也注释在实体类上,对应数据库中相应的
  • @Id、@Column注解用于标注实体类中的字段pk字段标注为@Id其余@Column

5.6 配置文件导入

5.6.1 @PropertySource
引入单个properties文件:

@PropertySource(value = {"classpath : xxxx/xxx.properties"})

引入多个properties文件:

@PropertySource(value = {"classpath : xxxx/xxx.properties""classpath : xxxx.properties"})```
5.6.2 @ImportResource
  • 导入xml配置文件
  • 可以额外分为两种模式 相对路径classpath,绝对路径(真实路径)file
注意:单文件可以不写value或locations,value和locations都可用

相对路径(classpath)

引入单个xml配置文件:@ImportSource("classpath : xxx/xxxx.xml")

引入多个xml配置文件:@ImportSource(locations={"classpath : xxxx.xml" , "classpath : yyyy.xml"})

绝对路径(file)

引入单个xml配置文件:@ImportSource(locations= {"file : d:/hellxz/dubbo.xml"})

引入多个xml配置文件:@ImportSource(locations= {"file : d:/hellxz/application.xml" , "file : d:/hellxz/dubbo.xml"})

取值:使用@Value注解取配置文件中的值

@Value("${properties中的键}")
private String xxx;
5.6.3 @Import
  • 导入额外的配置信息
  • 可以导入带有@Configuration注解的配置类或实现了ImportSelector/ImportBeanDefinitionRegistrar
@SpringBootApplication
@Import({SmsConfig.class})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

5.7 全局异常处理

5.7.1 @ControllerAdvice
  • 统一处理异常
  • 定义全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
}
5.7.2 @ExceptionHandler
  • 注解声明异常处理方法
@ControllerAdvice
public class GlobalExceptionHandler {
 
    @ExceptionHandler(Exception.class)
    @ResponseBody
    String handleException(){
        return "Exception Deal!";
    }
}

5.8 事务注解

  • 在Spring中,事务有两种实现方式,分别是编程式事务管理声明式事务管理两种方式
  • @Transactional注解

  • 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,Spring推荐使用TransactionTemplate。
  • 声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值