day73 - day01Java之springboot(04.13)

  • 每一个SpringBoot项目(微服务),都有一个主程序。用于启动服务器(自带Tomcat)

  • SpringBoot默认扫描主程序所载的包以及子包,推荐采用默认配置

  • 用于声明配置类。一个配置类就相当于一个xml配置文件
    @Configuration(Spring框架提供)
    @SpringBootConfiguration(SpringBoot框架提供)

  • 自动配置,SpringBoot框架底层提供了大量的配置类,这些配置类如何加载?

    • 从自动配置包(spring-boot-autoconfigure-2.2.2.RELEASE.jar)中查找META-INF/spring.factories文件,

    • 从文件里根据org.springframework.boot.autoconfigure.EnableAutoConfiguration全类名作为Key查找自动配置类(2.2.2共124个配置类)。

    • 然后根据以来配置环境(@ConditionalOnXxx)来决定哪些配置类生效。

    • SpringMVC框架核心控制器配置类

      • org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
    • SpringMVC字符编码过滤器配置类

      • org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
    • SpringMVC视图解析器配置类

      • org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
  • xxxConfiguration 配置类 等价于 XML相关配置

1.什么是微服务?

简单地说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成很多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP RESTful API 进行通信协作。被拆分成的每一个小型服务都围绕着系统中的某一项或一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储、业务开发、自动化测试案例以及独立部署机制。由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写。

In short(简言之), the microservice architectural style 【架构风格】[1] is an approach to developing a single application as a suite of small services【独立应用变成一套小服务】, each running in its own process and communicating with lightweight(轻量级沟通) mechanisms(每一个都运行在自己的进程内(容器)), often an HTTP resource API(用HTTP,将功能写成能接受请求). These services are built around business capabilities (独立业务能力)and independently deployable by fully automated deployment machinery(应该自动化独立部署). There is a bare minimum of centralized management of these services(应该有一个能管理这些服务的中心), which may be written in different programming languages (独立开发语言)and use different data storage technologies(独立的数据存储)

2.@Autowired和@Resource区别?

@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
@Resource装配顺序:
1、如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2、如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3、如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4、如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

3.SpringBoot常用注解?

@SpringBootApplication:
包含@Configuration、@EnableAutoConfiguration、@ComponentScan
通常用在主类上。

@Repository:
用于标注数据访问组件,即DAO组件。

@Service:
用于标注业务层组件。

@RestController:
用于标注控制层组件(如struts中的action),包含@Controller和@ResponseBody。

@ResponseBody:
表示该方法的返回结果直接写入HTTP response body中
一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。

@Component:
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@ComponentScan:
组件扫描。个人理解相当于context:component-scan,如果扫描到有@Component @Controller @Service等这些注解的类,则把这些类注册为bean。

@Configuration:
指出该类是 Bean 配置的信息源,相当于XML中的,一般加在主类上。
@Bean:
相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

@EnableAutoConfiguration:
让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,一般加在主类上。

@AutoWired:
byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
当加上(required=false)时,就算找不到bean也不报错。

@Qualifier:
当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用
@Resource(name=“name”,type=“type”):
没有括号内内容的话,默认byName。与@Autowired干类似的事。

@RequestMapping:
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
该注解有六个属性:
params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
value:指定请求的实际地址,指定的地址可以是URI Template 模式
method:指定请求的method类型, GET、POST、PUT、DELETE等
consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

@RequestParam:
用在方法的参数前面。
@RequestParam String a =request.getParameter(“a”)。

@PathVariable:
路径变量。参数与大括号里的名字一样要相同。
RequestMapping(“user/get/mac/{macAddress}”)
public String getByMacAddress(@PathVariable String macAddress){
  //do something;

@Profiles
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。
任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机。
@Configuration
@Profile(“prod”)
public class ProductionConfiguration {
// …
}

@ConfigurationProperties
Spring Boot将尝试校验外部的配置,默认使用JSR-303(如果在classpath路径中)。
你可以轻松的为你的@ConfigurationProperties类添加JSR-303 javax.validation约束注解:
@Component
@ConfigurationProperties(prefix=“connection”)
public class ConnectionSettings {
@NotNull
private InetAddress remoteAddress;
// … getters and setters
}

全局异常处理 @ControllerAdvice:
包含@Component。可以被扫描到。
统一处理异常。

@ExceptionHandler(Exception.class):
用在方法上面表示遇到这个异常就执行以下方法。

4.SpringBoot自动配置原理?

自动配置,SpringBoot框架底层提供了大量的配置类,这些配置类如何加载?

  •  从自动配置包(spring-boot-autoconfigure-2.2.2.RELEASE.jar)中查找META-INF/spring.factories文件,
    
  •  从文件里根据org.springframework.boot.autoconfigure.EnableAutoConfiguration全类名作为Key查找自动配置类(2.2.2共124个配置类)。
    
  •  然后根据以来配置环境(@ConditionalOnXxx)来决定哪些配置类生效。
    
  •  SpringMVC框架核心控制器配置类
    
  •  org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
    
  •  SpringMVC字符编码过滤器配置类
    
  •  org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
    
  •  SpringMVC视图解析器配置类
    
  •  org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
    
  •  xxxConfiguration 配置类 等价于 XML相关配置
    

5.你用过SpringBoot框架哪些场景启动器?

Spring Boot提供了很多场景启动器,都是以spring-boot-starter-xx作为命名的。
spring-boot-starter-logging :使用 Spring Boot 默认的日志框架 Logback。
spring-boot-starter-log4j :添加 Log4j 的支持。
spring-boot-starter-web :支持 Web 应用开发,包含 Tomcat 和 spring-mvc。
spring-boot-starter-tomcat :使用 Spring Boot 默认的 Tomcat 作为应用服务器。
spring-boot-starter-jetty :使用 Jetty 而不是默认的 Tomcat 作为应用服务器。
spring-boot-starter-test :包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。
spring-boot-starter-aop :包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。
spring-boot-starter-security :包含 spring-security。
spring-boot-starter-jdbc :支持使用 JDBC 访问数据库。
spring-boot-starter-redis :支持使用 Redis。

概述

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。开箱即用,习惯优于配置。为什么使用Spring Boot
J2EE笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。Spring Boot是什么
一站式整合所有应用框架的框架;并且完美整合Spring技术栈;
Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用。Spring boot 优点
快速创建独立运行的Spring项目以及与主流框架集成
使用嵌入式的Servlet容器,应用无需打成WAR包
starters自动依赖与版本控制
大量的自动配置,简化开发,也可修改默认值
无需配置XML,无代码生成,开箱即用
准生产环境的运行时应用监控
与云计算的天然集成
项目架构-单体应用

优点

  • 为人所熟知:现有的大部分工具、应用服务器、框架和脚本都是这种应用程序;
  • IDE友好:像 NetBeans、Eclipse、IntelliJ 这些开发环境都是针对开发、部署、调试这样的单个应用而设计的;
  • 便于共享:单个归档文件包含所有功能,便于在团队之间以及不同的部署阶段之间共享;
  • 易于测试:单体应用一旦部署,所有的服务或特性就都可以使用了,这简化了测试过程,因为没有额外的依赖,每项测试都可以在部署完成后立刻开始;
  • 容易部署:只需将单个归档文件复制到单个目录下。

不足

  • 不够灵活:对应用程序做任何细微的修改都需要将整个应用程序重新构建、重新部署。开发人员需要等到整个应用程序部署完成后才能看到变化。如果多个开发人员共同开发一个应用程序,那么还要等待其他开发人员完成了各自的开发。这降低了团队的灵活性和功能交付频率;
  • 妨碍持续交付:单体应用可能会比较大,构建和部署时间也相应地比较长,不利于频繁部署,阻碍持续交付。在移动应用开发中,这个问题会显得尤为严重;
  • 受技术栈限制:对于这类应用,技术是在开发之前经过慎重评估后选定的,每个团队成员都必须使用相同的开发语言、持久化存储及消息系统,而且要使用类似的工具,无法根据具体的场景做出其它选择;
  • 技术债务:“不坏不修(Not broken,don’t fix)”,这在软件开发中非常常见,单体应用尤其如此。系统设计或写好的代码难以修改,因为应用程序的其它部分可能会以意料之外的方式使用它。随着时间推移、人员更迭,这必然会增加应用程序的技术债务。

项目架构-微服务

https://www.martinfowler.com/articles/microservices.html 微服务microservices
http://blog.cuicc.com/blog/2015/07/22/microservices/

什么是微服务

In short(简言之), the microservice architectural style 【架构风格】[1] is an approach to developing a single application as a suite of small services【独立应用变成一套小服务】, each running in its own process and communicating with lightweight(轻量级沟通) mechanisms(每一个都运行在自己的进程内(容器)), often an HTTP resource API(用HTTP,将功能写成能接受请求). These services are built around business capabilities (独立业务能力)and independently deployable by fully automated deployment machinery(应该自动化独立部署). There is a bare minimum of centralized management of these services(应该有一个能管理这些服务的中心), which may be written in different programming languages (独立开发语言)and use different data storage technologies(独立的数据存储)

SpringBoot-HelloWorld初体验1.创建maven工程:2.引入如下依赖

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.2.2.RELEASE</version>
</parent>
<dependencies>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

3.编写主程序

@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}

4.增加控制器

@Controller
public class HelloController {
@ResponseBody
@GetMapping("/hello")
public String handle01(){
return "OK!+哈哈";
}
}

5.运行访问
http://localhost:8080/hello

SpringBoot-依赖配置

https://docs.spring.io/spring-boot/docs/2.2.2.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-starter

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>spring-boot-01</artifactId>
<version>0.0.1-SNAPSHOT</version>


 
<!-- 用来做依赖管理,所有依赖的版本都声明好了-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<!-- spring-boot-starter-xxx:场景启动器;
开发web程序就引用web场景spring-boot-starter-web;
SpringBoot自定引入这个场景所需要的所有依赖;
-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>

快速创建SpringBoot应用1 创建Spring Starter Project

  • 联网创建
    • 选择版本,引入需要的依赖,注意选择版本
    • 项目结构
    • 自动生成主程序类,用于启动项目
    • 自动生成静态资源目录及属性配置文件
    • 自动生成测试类
    • 自动增加pom.xml相关依赖配置
    • 增加控制器类
    • 支持Restful风格注解。
@RestController //等价于@Controller + @ResponseBody
public class HelloController {

    //@RequestMapping(value = "/hello", method = RequestMethod.GET)
    //@PostMapping("/hello") //只处理POST请求
    //@DeleteMapping("/hello") //只处理DELETE请求
    //@PutMapping("/hello") //只处理PUT请求
    @GetMapping("/hello") //只处理GET请求
    public String handle01() {
        return "OK!+哈哈";
    }
}
  • 运行测试
    http://localhost:8080/hello6 加载静态资源
    在static文件夹下存放java.jpg图片, http://localhost:8080/java.jpg7 属性配置:application.properties
    https://docs.spring.io/spring-boot/docs/2.2.2.BUILD-SNAPSHOT/reference/htmlsingle/#appendix
server.port=8081
server.servlet.context-path=/a
server.servlet.session.timeout=30
server.tomcat.max-threads=800
server.tomcat.uri-encoding=UTF-8 

文件加载规则
SpringBoot使用一个全局的配置文件,配置文件名是固定的
org.springframework.boot.context.config.ConfigFileApplicationListener
application.properties

application.yml9 整合Thymeleaf(模板引擎技术-代替jsp)

  • 增加依赖模块
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  • 增加属性配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
  • 增加控制器方法
@RequestMapping("/test")
public String test() {
      System.out.println("test...");
      return "test";  //视图解析 
}

增加视图:/templates/test.html

SpringBoot-yml配置文件

  • YAML语法

    • YAML基本语法

      • 使用缩进表示层级关系
      • 缩进时不允许使用Tab键,只允许使用空格。
      • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
      • 大小写敏感
    • YAML 支持的三种数据结构

      • 对象:键值对的集合
      • 数组:一组按次序排列的值
      • 字面量:单个的、不可再分的值
  • 值的写法

    • 字面量:普通的值(数字,字符串,布尔)
      • k: v:字面直接来写;
      • 字符串默认不用加上单引号或者双引号;
      • “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
      • name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
      • ‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
      • name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
    • 对象、Map(属性和值)(键值对):
      • k: v:在下一行来写对象的属性和值的关系;注意缩进
      • 对象还是k: v的方式
        friends:
        lastName: zhangsan
        age: 20
        行内写法:friends: {lastName: zhangsan,age: 18}
  • 数组(List、Set)

    • 用- 值表示数组中的一个元素
      pets:
      ‐ cat
      ‐ dog
      ‐ pig
      行内写法pets: [cat,dog,pig]

SpringBoot-自动配置原理1 自动配置原理

SpringBoot提供了大量的配置类

* 

spring-boot-autoconfigure-2.2.2.RELEASE.jar
*
好多的场景全部自动配置好

1. 

自动配置原理:

* 

主程序类标注了@SpringBootApplication注解,相当于标注了@EnableAutoConfiguration
*
@EnableAutoConfiguration 开启SpringBoot的自动配置功能

1. 

如:HttpEncodingAutoConfiguration

* 

@ConditionalOnXX判断配置是否需要生效
*
@Bean声明对象
*
配置文件=>属性类,比如HttpEncodingProperties
*
这写配置文件值的封装类都是和配置文件一一绑定

@ConfigurationProperties(prefix = “spring.http.encoding”)
HttpEncodingProperties
1.
如果默认的组件我们不用;可以自定义组件。

@Bean
@ConditionalOnMissingBean:容器中没这个组件
public InternalResourceViewResolver defaultViewResolver(){…}
SpringBoot的一个最大策略:自定义组件用自己的,否则,使用默认的。2 自定义配置类
注:Spring创建Bean三种声明方式
*

标签
*

* 

组件注解
*
@Component @Controller @Service @Repository

* 

自定义配置类

@Configuration
public class AppConfig {
@Bean
public User user(){
return new User();
}
}

SpringBoot整合mybatis配置版

  • 创建Spring Starter Project
    增加web,jdbc,mybatis,mysql相关组件
  • 增加application.yml
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/scw?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  config-location: classpath:/mybatis/mybatis-config.xml
  mapper-locations: classpath:/mybatis/mapper/*.xml
  • 增加mybatis主配置文件mybatis-config.xml
<?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>
</configuration>
  • 增加实体类:TAdmin
  • 增加Mapper接口
public interface AdminMapper {
public TAdmin getAdminById(Integer id);
}
  • 增加映射配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mapper.AdminMapper">
         <select id="getAdminById" resultType="com.atguigu.bean.TAdmin">
                 SELECT * FROM `t_admin` WHERE id=#{id}
         </select>
</mapper>
  • 增加Service
public interface AdminService {
public TAdmin getAdminById (Integer id);
}
 
public class AdminServiceImple implements AdminService {
	@Autowired
    TAdminMapper adminMapper;
	public TAdmin getAdminById (Integer id){
		return adminMapper.getAdminById(id);
	}
}
  • 增加控制器
@RestController 等于@Controller + @ResponseBody
支持Restful注解:@GetMapping @PostMapping @PutMapping @DeleteMapping
@RestController
public class AdminController {
	@Autowired
	AdminService adminService;
	@GetMapping("/getAdminById/{id}")
	public TAdmin getAdminById (@PathVariable("id") Integer id){
		return adminService.getAdminById(id);
	}
}
  • 主程序增加mapper扫描
@MapperScan("com.atguigu.mapper")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值