[SpringBoot] - 一份笔记

 

一. Spring Boot 入门

1. Spring Boot 简介

简化Spring应用开发的一个框架;

整个Spring技术栈的一个大整合;

J2EE开发的一站式解决方案;

2. 微服务

2014, martin fowler 提出

微服务 : 架构风格(服务微化)

一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;

单体应用: ALL IN ONE , 比如之前的教育项目,整个打包后在一个war或者jar中.

微服务: 每一个功能元素最终都是一个可独立替换和独立升级的软件单元;

简而言之,微服务架构风格是一种将单个应用程序开发为一套小型服务的方法,

每个小型服务都在自己的流程中运行,并于轻量级机制(通常是HTTP资源API)进行通信.

这些服务围绕业务功能构建,可通过全自动部署机制独立部署. 这些服务至少集中管理,

可以用不同的编程语言编写, 并使用不同的数据存储技术.

 

 

这种单体应用对系统的任何更改都涉及构建和部署新版本的服务器端应用程序.

以上单体应用的弊端导致了微服务架构风格的诞生: 将应用程序构建为服务套件,

除了服务可独立部署和扩展外,每个服务还提供了一个牢固的模块边界,

甚至允许以不同的编程语言编写不同的服务.

我们并不认为微服务风格是新颖的或创新的,其根源至少可以归结为Unix的设计原则.

更多:https://martinfowler.com/articles/microservices.html#

MAVEN设置:

maven的settings.xml配置文件的profiles标签:

<profile>
  <id>jdk-1.8</id>
  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
  </activation>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  </properties>
</profile>

简化部署:

 <!-- 这个插件,可以将应用打包成一个可执行的jar包;-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

 

主程序类,主入口类

/**
 *  @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
 */
@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) {

        // Spring应用启动起来
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}

@SpringBootApplication : 

Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用.

@SpringBootApplication是一个组合注解,是一个"三体"结构,实际上它是一个复合的Annotation.

三体结构指得是: 

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

使用以上三个注解也能使用@SpringBootApplication,同样效果,只不过还是使用@SpringBootApplication更加简洁.

查看该注解源码:其后参照JSR303的一些注解使用.参照之前的自定义注解: https://www.cnblogs.com/ukzq/p/9947870.html

其中都存在的三个注解是:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented

>>>首先看Retention注解:

Retention(保留)注解,这种类型的注解会被保留到哪个阶段?

1. RetentionPolicy.SOURCE -- 这种类型的Annotations只在源代码级别保留,编译时就会被忽略.

2. RetentionPolicy.CLASS -- 这种类型的Annotations编译时被保留,在class文件中存在,但JVM会忽略.

3. RetentionPolicy.RUNTIME -- 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其它使用反射机制的代码所读取和使用.

可以看到在@SpringBootApplication源码中,注解的保留级别为: 

@Retention(RetentionPolicy.RUNTIME)

即说明该注解会被JVM保留,在运行时被JVM或其它使用反射机制的代码所读取和使用.

>>>再来看Documented注解:

Documented注解表明这个注解应该被javadoc工具记录,默认情况下,javadoc是不包括注解的,

但如果声明注解时指定了@Documented, 则它会被javadoc之类的工具处理,所以注解类型信息

也会被包括在生成的文档中.

>>>Target注解

@Target说明了Annotation所修饰的对象范围: Annotation可被用于packages, types(类,接口,枚举,Annotation类型_

类型成员(方法,构造方法,成员变量,枚举值), 方法参数和本地变量(如循环变量,catch参数). 在Annotation类型的声明中

使用了target可更加明晰其修饰的目标.

作用: 用于描述注解的使用范围(即: 被描述的注解可以在什么地方使用)

@Target的取值(ElementType)有:

1. CONSTRUCTOR : 用于描述构造器

2. FIELD : 用于描述域

3. LOCAL_VARIABLE : 用于描述局部变量

4. METHOD : 用于描述方法

5. PACKAGE : 用于描述包

6. PARAMETER : 用于描述参数

7. TYPE : 用于描述类, 接口(包括注解类型) 或enum声明.

可以看到在@SpringBootApplication的注解中Target为@Target(ElementType.TYPE),说明这是描述类和接口的.

>>>补充 Inherited 注解

这是一个稍微复杂的注解类型,它指明被注解的类会自动继承, 更具体地说, 如果定义注解时使用了@Inherited标记,

然后用定义的注解来标注另一个父类,父类又有一个子类(subclass),则父类的所有属性将被继承到它的子类中.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

>>>再说@SpringBootConfiguration : 是Spring Boot的配置类,

标注在某个类上,表示这是一个SpringBoot的配置类,

在@SpringBootConfiguration中源码没有什么卵

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

最主要的是它的@Configuration注解.

@Configuration:配置类上来标注这个注解.

配置类---配置文件;配置类也是容器中的一个组件; 类似@Component可以将组件加载到ioc容器.

>>>再看@EnableAutoConfiguration注解, 字面量翻译过来就说明:这个注解是用来开启自动配置功能.

以前我们需要配置的东西,SpringBoot帮我们自动配置,@EnableAutoConfiguration告诉SpringBoot

开启自动配置功能,这样自动配置才能生效.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

在其中的@AutoConfigurationPackage注解为自动配置包注解.

@Import(AutoConfigurationImportSelector.class)是Spring的底层注解@Import,

作用是给容器导入一个组件; 导入的组件由AutoConfigurationPackages.Registrar.class

将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到

Spring容器;

 

posted @ 2018-12-25 16:02  ukyo--BlackJesus  阅读(275)  评论(0编辑  收藏  举报