https://www.imooc.com/video/16358
https://www.imooc.com/learn/1058
https://www.imooc.com/video/16783
简介
- 官网:http://spring.io/,https://spring.io/projects/spring-boot
- 英文文档:https://docs.spring.io/spring-boot/docs/current/reference/
- Spring Framework是一种JavaEE的框架;Spring Boot是一种快速构建的Spring应用;Spring Cloud是构建SpringBoot的分布式应用
- Spring MVC 相当于一辆手动挡汽车,Spring Boot 相当于把汽车变成自动挡,然后还加装了无钥匙进入、自动启停等功能,让你开车更省心。但是车的主体功能不变,你还是要用到 Spring MVC
SpringBoot2.0: 编程语言Java 8+,Kotlin,底层框架:SpringFramework 5.0.X,支持Web Flux
Web Flux
- 支持函数编程,Java 8 Lambda
- 响应式编程,Reactive Streams
- 异步编程,Servlet3.1和Asyc NIO
SpringBoot优势:
- 组件自动装配:规约大于配置,专注核心业务
- 外部化部署:一次构建、按需调配,到处运行
- 嵌入式容器:内置容器、无需部署、独立运行
- SpringBoot Starter:简化依赖、按需装配、自我包含
- Production-Ready:一站式运维、生态无缝整合
SpringBoot和Maven
1 | <parent> |
1 | spring-boot-starter-web 模块,包括了Tomcat和Spring MVC的依赖 |
1 | spring-boot-starter-test 测试模块,包括JUnit、Hamcrest、Mockito |
com.student.id=6228
com.student.name=lily
com.student.desc=${name} id is ${random.int}
1 | * 定义属性对应类需要添加@Component注解,让spring在启动的时候扫描到该类,并添加到spring容器中 |
@Component
public class Student {
@Value("{com.student.name}")
private String name;
@Value("${com.student.desc}")
private String desc;
}
1 | 2. 使用@ConfigurationProperties(prefix="") 设置前缀,属性上不需要添加注解 |
@Component
@ConfigurationProperties(prefix = “com.student”)
public class Student {
private int id;
private String name;
private String desc;
}
1 | 使用: |
@Autowired
private Student student;
1 | ## 属性配置优先级 |
application-dev.properties //开发环境的配置文件
application-test.properties //测试环境的配置文件
application-prod.properties //生产环境的配置文件
1 | 在application.properties/在application.yml中设置spring.profiles.active的值为{profile}(dev/test/prod)来启用不同的配置属性 |
//优先级由高到低
classpath:/META-INF/resources
classpath:/resources
classpath:/static
classpath:/public
1 | 可以通过修改spring.mvc.static-path-pattern来修改默认的映射,例如我改成/test/**,那运行的时候访问http://lcoalhost:8080/test/index.html |
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//将所有/static/** 访问都映射到classpath:/static/ 目录下
registry.addResourceHandler("/static/**").addResourceLocations(“classpath:/static/”);
}
}
1 |
|
1 | * Jpa 是利用 Hibernate 生成各种自动化的 sql,如果只是简单的增删改查,基本上不用手写了,Spring 内部已经帮大家封装实现了 |
1 |
|
dependency>
1 | * spring-boot-configuration-processor:spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,则需要依赖他,这样就可以在你的配置类开头加上@PropertySource("classpath:your.properties"),其余用法与加载yml的配置一样 |
@ConfigurationProperties(prefix = “spring.person”)
@Data
public class PersonProperties {
private String name;
private int age;
}
1 | 3. 核心服务类,如PersonService.java: |
public class PersonService {
private PersonProperties properties;
public PersonService() {}
public PersonService(PersonProperties properties) {
this.properties = properties;
}
public void sayHello(){
System.out.println("大家好,我叫: " + properties.getName() + “, 今年” + properties.getAge() + “岁”);
}
}
1 | 4. 自动配置类:一般每个starter都至少会有一个自动配置类,一般命名规则使用XxxAutoConfiguration,如:PersonServiceAutoConfiguration |
@Configuration
@EnableConfigurationProperties(PersonProperties.class)
@ConditionalOnClass(PersonService.class)
@ConditionalOnProperty(prefix = “spring.person”, value = “enabled”, matchIfMissing = true)
public class PersonServiceAutoConfiguration {
@Autowired
private PersonProperties properties;
@Bean
@ConditionalOnMissingBean(PersonService.class) // 当容器中没有指定Bean的情况下,自动配置PersonService类
public PersonService personService(){
PersonService personService = new PersonService(properties);
return personService;
}
}
1 | 所用注解说明: |
@ConditionalOnClass:当类路径classpath下有指定的类的情况下进行自动配置
@ConditionalOnMissingBean:当容器(Spring Context)中没有指定Bean的情况下进行自动配置
@ConditionalOnProperty(prefix = “example.service”, value = “enabled”, matchIfMissing = true),当配置文件中example.service.enabled=true时进行自动配置,如果没有设置此值就默认使用matchIfMissing对应的值
@ConditionalOnMissingBean,当Spring Context中不存在该Bean时。
@ConditionalOnBean:当容器(Spring Context)中有指定的Bean的条件下
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下
@ConditionalOnExpression:基于SpEL表达式作为判断条件
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
@ConditionalOnWebApplication:当前项目是Web项目的条件下
@ConditionalOnResource:类路径下是否有指定的资源
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean
@ConfigurationProperties: 主要用来把properties配置文件转化为对应的XxxProperties来使用的,并不会把该类放入到IOC容器中,想放入容器可通过@Component来标注或@EnableConfigurationProperties(XxxProperties.class)
@EnableConfigurationProperties(XxxProperties.class) 注解的作用是@ConfigurationProperties注解生效
1 | 5. src/main/resources/META-INF/spring.factories |
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.my.PersonServiceAutoConfiguration
1 | 6. 打包mvn clean install,生成starter的jar包 |
spring.person.name=jack
spring.person.age=28
1 | * 调用 |
@Autowired
private PersonService personService;
@Test
public void testHelloWorld() {
personService.sayHello();
}
# 其他SpringBoot学习资料
* http://www.ityouknow.com/springboot/2015/12/30/springboot-collect.html
拦截器功能:
重写WebMvcConfigurerAdapter中的addInterceptors方法把自定义的拦截器类添加进来即可简单的判断是否登录的使用
注解:
@SpringBootApplication是Sprnig Boot项目的核心注解,主要目的是开启自动配置
@RestController 这个注解相当于同时添加@Controller和@ResponseBody注解,用这个注解的类里面的方法都以json格式输出
@Component:让spring在启动的时候扫描到该类,并添加到spring容器中
@Bean:任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id
@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中
@Configuration:任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类
@ComponentScan:
* 自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中
* 可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描
* 所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages
@EnableAutoConfiguration:借助@Import的支持,收集和注册特定场景相关的bean定义
@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器