Spring Boot
概述:
SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而人大提高了开发的效率,一定程度上缩短了项目周期。
Spring的顶级项目之—(https://spring.io)。
1.Spring Boot配置
1.1获取数据
#数组
address:
- beijing
- shanghai
#数组行内写法
address2: [beijing,shanghai]
#纯量
mseeage1: "Hello \n World"# 不会识别转义符,原样输出
mseeage2: 'Hello \n World'# 会识别转义符
1.1.1 @Value
@Value("${name}")
private String name;
@Value("${age}")
private String age;
/*获取对象的值*/
@Value("${person.name}")
private String name2;
@Value("${person.age}")
private String age2;
/*获取数组的值*/
@Value("${address[0]}")
private String address0;
@Value("${address[1]}")
private String address1;
1.1.2 Environment
@Autowired
/*org.springframwork.core.env*/
private Environment env;
env.getProperty("name")
1.1.3 @ConfigurationProperties
@Component
/*注入时设置prefix*/
@ConfigurationProperties(prefix = "person")
public class Person{
private String name;
private String age;
…………
/*加上set、get方法*/
}
1.2 profile
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
1.2.1 profile 配置方式
-
多profile文件方式:
- application.properties
- application-dev.properties
- application-pro.properties
- application-test.properties
-
yml多文档方式:在yaml中使用—分隔不同配置
--- server: port: 8081 spring: profiles: dev --- server: port: 8082 spring: profiles: test --- server: port: 8083 spring: profiles: pro --- spring: profiles: active: pro
1.2.2 profile 激活方式
-
配置文件
-
虚拟机参数
- VM options:-Dspring.profiles.active=test
-
命令行参数
- –spring.profiles.active=pro
- Java -jar .\spring-profile.jar --spring.profiles.active=pro
1.3内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
- file:/config/:当前项目下的/config目录下
- file:/:当前项目的根目录
- classpath:/config/: classpath的/config目录
- classpath:classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会生效
1.4外部配置加载顺序
-
java -jar myproject.jar --server.port=8088 -server.servlet.context-path=/hehe
-
java -jar myproject.jar --spring.config.location=classpath
2.Spring Boot整合其他框架
2.1整合Junit
- 搭建SpringBoot工程>
- 引入starter-test起步依赖
- 编写测试类
- 添加测试相关注解
-
@RunWith(SpringRunner.class)
-
@SpringBootTest(classes =启动类.class)
5.编写测试方法
2.2整合Redis
-
搭建SpringBoot工程
-
引入redis起步依赖
-
配置redis相关属性
spring: redis: host: 127.0.0.1 port: 6379
-
注入RedisTemplate模板
-
编写测试方法,测试
2.3整合MyBatis
-
搭建SpringBoot工程
-
引入mybatis起步依赖,添加mysql驱区动
-
编写DataSource和MyBatis相关配置
#mybatis mybatis: mapper-locations: classpath:mapper/*Maper.xml # mapper映射文件路径 type-aliases-package: com.itheima.springbootmybatis.domain # 别名 config-location: #mybatis核心配置文件
-
定义表和实体樂
-
编写dao和mapper文件/纯注解开发
-
测试
Spring Boot原理分析
3.1Spring Boot自动配置
3.1.1 Condition
Condition 是在Spring4.0增加的条件判断功能,通过这个可以功能可以实现选择性的创建Bean操作 。
在Spring的 IOC 容器中有一个 User 的 Bean,现要求:
1.导入Jedis坐标后,加载该Bean,没导入,则不加载
@Configuration
public class UserConfig{
@Bean
@Conditional(ClassCondition.clss)
/*ClassCondition.clss实现Condition方法中的matches方法,@Conditional内部指定你所创建的那个条件对象,返回true则创建*/
public User user(){
return new User();
}
}
public class ClassCondition implements Condition {
@Override
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
//1.需求:导入Jedis坐标后创建Bean
boolean flag = true;
try{
Class<?> cls = Class.forName("redis.clients.jedis.Jedis")
}catch(ClassNotFoundException e){
flag = false;
}
return flag;
}
}
2.将类的判断定义为动态的。判断那个字节码文件存在可以动态指定
//自定义注解
@Target ({ElementType. TYPE, ElementType.METHOD})
CRetention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ClassCondition.clss)
public @interface ConditionalOnClass {
String[] values();
}
public class ClassCondition implements Condition {
/**
* @param context 上下文对象。用于获取环境,T0C容器,CLassLoaden对象
* @param metadata 注解元对象。可以用于获取注解定义的属性值
* @retumn
*/
@Override
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
//获取注解属性值 value
Map<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
//1.需求:导入Jedis坐标后创建Bean
boolean flag = true;
try{
Class<?> cls = Class.forName("redis.clients.jedis.Jedis")
}catch(ClassNotFoundException e){
flag = false;
}
return flag;
}
}
@Bean
@ConditionalOnClass(ClassCondition.clss)
public User user(){
return new User();
}
总结:
- 自定义条件:
① 定义条件类:自定义类实现Condition接口,重写matches方法,在 matches 方法中进行逻辑判断,返回boolean值。
matches 万法两个参数:
-
context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。
-
metadata:元数据对象,用于获取注解属性。
② 判断条件:在初始化Bean时,使用@conditional(条件类.olass)注解
- SpringBoot 提供的常用条件注解:
- ConditionalonProperty:判断配置文件中是否有对应属性和值才初始化Bean
- conditionalonclass:判断环境中是否有对应字节码文件才初始化Bean
- conditionalonMissinqBean: 判断环境中没有对应Bean才初始化Bean
3.1.2切换内置web服务器
Web服务器同样是依赖于@ConditionalOnClass() ,在某种类型的web服务器只有当该类的web服务器初始化后,才会注入到Bean中。
因此,我们要切换Web服务器的步骤:
- 排除当前服务器的依赖
- 添加需要的服务器依赖即可
3.1.3 @Enable*注解
SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态启用某些功能的。而其底层原埋是使用@Import解导入一些配置类,实现Bean的动态加载。
Spring Boot注入外部的bean
-
@ComponentScan()
-
@Import()注解,加载类。这些类都会被Spring创建,并放到IOC容器中
-
对 Import 注解进行封装
3.1.4 @Import注解
@Enable*底层依赖于@Import注解导入一些类,使用@Import导入的类会被Spring加载到IOC容器中。而@Import提供4中用法:
- 导入Bean
- 导入配置类
- 导入ImportSelector实现类。一般用于加载配置文件中的类
- 导入ImportBeanDefinitionRegistrar 实现类。
3.1.5 @EnableAutoConfiguration
- @EnableAutoConfiguration 注解内部使用@Import (AutoConfigurationImportSelector.class) 来加载配置类。
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当SpringBoot应用启动时,会自动加载这些配置类,初始化Bean
- 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean
4.Spring Boot 监听机制
Java 监听机制
SpringBoot的监听机制,其实是对Java提供的事件监听机制的封装。
Java中的事件监听机制定义了以下几个角色:
- 事件:Event,继承java.util.EventObject 类的对象
- 事件源:Source,任意对象Object
- 监听器:Listener,实现java.util EventListener接口的对象
SpringBoot 监听机制
SpringBoot在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在恐目启动时完成一些操作。
SpringApplicationRunListener, CommandLineRunner注入后就立刻生效
ApplicationContextInitializer, ApplicationRunner需要在spring.factories中配置全路径名