SpringBoot综述

 

Springboot

新的框架,基于spring框架的工具框架.boot可以将spring容器和依赖的环境独立运行

特点

实现容器的独立运行

可以以jar包形式启动一个具备spring容器的所有特点的工程

通过main方法执行启动一个spring容器

内嵌了servlet容器

默认内嵌式tomcat,可以根据依赖替换成jetty,undertow

提供了简化依赖

例如:开发一个web应用 spring-web,spring-webmvc,jackson-core等

springboot提供spring-boot-starter-web的简化依赖

核心特性(自动配置)

是由于低层经过了大量代码编写,扩展了自动配置的逻辑,会根据使用场景创建内存对象

 

手动搭建一个springboot

pom文件修改 pom.xml

添加继承springboot-parent工程

开发web应用,添加开发web应用依赖starter-web

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>
​
​
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency> -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
</dependencies>

src/main/java

com.wiscom.controller
package com.wiscom.controller;
​
@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;
    
    @RequestMapping("hello")
    public String sayHi(String name){
        return "controller:"+helloService.sayHi(name);
    }
}
com.wiscom.service
package com.wiscom.service;
​
@Service
public class HelloService {
    public String sayHi(String name) {
        return "service"+"hello springboot "+name;
    }
}
com.wiscom
package com.wiscom;
​
//springboot的核心注解
@SpringBootApplication
public class StarterDemo01 {
    //当前springboot中唯一的一个入口方法main
    public static void main(String[] args) {
        //SpringBoot体工程启动对象
        SpringApplication.run(StarterDemo01.class, args);
    }
}

springboot配置

application.properties

springboot的全局配置,

绝大多数应用场景使用的属性都可以在这个配置文件中配置读取

实现端口修改

访问路径的修改

src/main/resourses

application.properties

properties文件可以用yaml格式书写

这是全局配置

server.port=8090
server.context-path=/1905
​
#spring.datasource.driverClassName=com.jdbc.mysql.Driver
#datasource
#mybatis
#redis
#rabbitmq
#elasticsearch

 

自动配置原理

springboot自动配置利用的注解

@Configuration 定义配置类

@bean 配置bean对象

@ConfigurationProperties 读取对象需要的属性

java语言

javaconfig:将xml语言解析成内存对象,相当于DOM/SAX解析器

jdk1.5出现,spring利用javaconfig特性,将xml文件转化为注解

@Configuration:表示一个完整的xml文件

@ComponentScan:表示xml中<context:compoment-scan>

@Bean:表示一个xml文件中的<bean>标签

.......

spring 需要掌握的标签

@configuration

@Bean

@ConfigurationProperties

@conditionalOnClass

.....

 

将xml文件转化为注解的形式

src/main/java

com.wiscom
StartDemo.java
package com.wiscom;
​
//springboot的核心注解
@SpringBootApplication
public class StartDemo {
    
    // springboot中唯一的一个入口方法main
    public static void main(String[] args) {
        SpringApplication.run(StartDemo.class, args);
    }
}
com.wiscom.pojo
MyBean.java
package com.wiscom.pojo;
​
// 需要生成bean标签对象
public class Mybean {
    private int age;
    private String name;
   
    public Mybean() {
        System.out.println("Mybean被创建成功");
    }
    
}
com.wiscom.config
MyBeanConfig.java
package com.wiscom.config;
​
// 配置类的注解,相当于一个独立的xml文件加载的内容
@Configuration
public class MybeanConfig {
    // 相当于  <bean id="initMybean" class="com.wiscom.pojo.Mybean">
    @Bean   
    public Mybean initMybean(){
        return new Mybean();
    }
}
​
com.wiscom.controller
HelloController.java
package com.wiscom.controller;

@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;
    
    // 引用bean,查看是否被创建成功
    @Autowired
    private Mybean mybean;
    
    @RequestMapping("hello")
    public String sayHi(String name){
        return "controller:"+helloService.sayHi(name);
    }
}

 

@ConfigurationProperties的使用

可以读取配置中的值:properties/yml

可以定义前缀,自动赋值给类中的同名属性

src/main/resources

application.properties
springboot.conf.test.url=1
springboot.conf.test.username=1
springboot.conf.test.password=1
springboot.conf.test.driver=1

 

src/main/java

com.wiscom.pojo
Yourbean.java
package com.wiscom.pojo;

public class Yourbean {
    private String url;
    private String driver;
    private String username;
    private String password;
    
    public Yourbean(){
        System.out.println("YourBean已被创建");
    }
}

 

com.wiscom.config
YourBeanConfig.java

其中的属性值要从配置中读取

package com.wiscom.config;

@Configuration
// 配置文件中的值要以 springboot.conf.test 为前缀
@ConfigurationProperties("springboot.conf.test")
public class YourBeanConfig {
    
    private String url;            //    springboot.conf.test.url
    private String username;    //    springboot.conf.test.username
    private String password;    //    springboot.conf.test.password
    private String driver;        //    springboot.conf.test.driver

    @Bean
    public YourBean initYourBean(){
        // 
        YourBean yb=new YourBean();
        // 创建一个YourBean对象,给其中的属性赋值
        yb.setUsername(username);
        yb.setPassword(password);
        yb.setDriver(driver);
        yb.setUrl(url);
        return yb;
    }
    
}

 

自动装配的核心注解

@ConditionalOnClass:当前环境可以扫描到类时,满足条件

@ConditionalOnBean:当前环境存在这个Bean对象时,满足条件

@ConditionalOnMissingClass:当环境没有class时,满足

@ConditionalOnMissingBean:当环境灭有bean时,满足

@ConditionalOnProperties:当环境具备什么properties属性值时,满足条件

举例

@ConditionalOnClass

src/main/java

com.wiscom.condition
ConditionalTestbean.java
package com.wiscom.condition;

public class ConditionalTestbean {
    private int age;
    private String name;
    
    public ConditionalTestbean() {
        System.out.println("ConditionalTestbean对象已被创建");
    }
}

 

com.wiscom.config
ConditionalConfig.java
package com.wiscom.config;

@Configuration
// 只有ConditionalTestbean类被加载后,才会加载这个类
// 如果没有这个类,会报错,但不影响运行
@ConditionalOnClass({ConditionalTestbean.class})
public class ConditionalConfig {
    @Bean
    public ConditionalTestbean iniMybean(){
        
        return new ConditionalTestbean();
    }
}

 

springboot的核心注解:@SpringBootApplication

@SpringBootApplication

是一个组合注解

组合注解

@SpringBootConfiguration:标识了一个配置类

效果等同于@Configuration

@EnableAutoConfiguration:自动转配实现注解

可以实现读取所有springboot扩展配置类的全路径名称

@ComponentScan:扫描

默认情况是根据注解所在的类的包名实现扫描范围的

 

@EnableAutoConfiguration

Import导入了一个开启自动配置导入选择器的对象

@Import(EnableAutoConfigurationImportSelector.class)

EnableAutoConfigurationImportSelector的父类

AutoConfigurationImportSelector中的getCandidateConfigurations方法获取了候选的配置类

方法中通过SpringFactoriesLoader可以加载所有自动配置中的文件spring.factory

spring.factory

位于Maven Dependencies包下 ----> spring-boot-autoconfigure---> META-INF(元数据) ----> spring.factories

 

run方法启动spring容器的过程

run调用

通过启动类反射对象,收集工程各种环境信息

收集spring启动前的各种初始化信息

利用收集的环境信息开始创建容器中各种对象

bean对象,configuratoin factory(加载配置文件)

收尾工作

将启动创建过程中的工具销毁

 

springboot自动配置原理

启动顺序

run方法启动

初始化收集环境信息,通过反射对象获取核心注解@SpringBootApplication

根据初始化信息,创建spring容器中各种对象

将中间对象销毁,保留spring容器清洁,启动结束

自动配置

springboot扩展了一大批需要自动配置类

每一个配置类的结构需要使用到spring的注解功能

@Configuration

标识一个配置类,相当于加载一个xml文件

@ConfigurationProperties

对象创建初始化,从配置文件中读取属性

@Conditional

衍生注解,指定加载配置类创建bean对象的详细条件

只有满足条件才会创建相应内容

@ConditionalOnClass

@ConditionalOnBean

@ConditionalOnMissingClass

@ConditionalOnMissingBean

@ConditionalOnProperties

posted @ 2020-08-19 20:16  minnersun  阅读(446)  评论(0编辑  收藏  举报