Spring Boot

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程序启动时,会从以下位置加载配置文件:

  1. file:/config/:当前项目下的/config目录下
  2. file:/:当前项目的根目录
  3. classpath:/config/: classpath的/config目录
  4. 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
  1. 搭建SpringBoot工程>
  2. 引入starter-test起步依赖
  3. 编写测试类
  4. 添加测试相关注解
  • @RunWith(SpringRunner.class)

  • @SpringBootTest(classes =启动类.class)

5.编写测试方法

2.2整合Redis
  1. 搭建SpringBoot工程

  2. 引入redis起步依赖

  3. 配置redis相关属性

    spring:
    	redis:
    		host: 127.0.0.1
    		port: 6379
    
  4. 注入RedisTemplate模板

  5. 编写测试方法,测试

2.3整合MyBatis
  1. 搭建SpringBoot工程

  2. 引入mybatis起步依赖,添加mysql驱区动

  3. 编写DataSource和MyBatis相关配置

    #mybatis
    mybatis:
    	mapper-locations: classpath:mapper/*Maper.xml # mapper映射文件路径
    	type-aliases-package: com.itheima.springbootmybatis.domain # 别名
    	config-location: #mybatis核心配置文件
    
  4. 定义表和实体樂

  5. 编写dao和mapper文件/纯注解开发

  6. 测试

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中用法:

  1. 导入Bean
  2. 导入配置类
  3. 导入ImportSelector实现类。一般用于加载配置文件中的类
  4. 导入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中的事件监听机制定义了以下几个角色:

  1. 事件:Event,继承java.util.EventObject 类的对象
  2. 事件源:Source,任意对象Object
  3. 监听器:Listener,实现java.util EventListener接口的对象
SpringBoot 监听机制

SpringBoot在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在恐目启动时完成一些操作。

SpringApplicationRunListener, CommandLineRunner注入后就立刻生效

ApplicationContextInitializer, ApplicationRunner需要在spring.factories中配置全路径名

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值