springboot 笔记(1)

2 篇文章 0 订阅
1 篇文章 0 订阅

最近很多的人都在说springboot 如何如何,跟他们聊天,其中不乏说对springboot非常熟悉的人,但是一到问到问题的时候,总是感觉回答不到点子上,所以自己研究了一段时间,留下笔记。在百度查询的时候,我碰到了几个关于springboot很有意思的问题,根据这些问题,做出以下的回答。如果有不同的见解,可以留言进行交流。

  1. Spring Boot 最主要是不用 XML 配置,可以用 Java 来配置 bean,省去了许多配置文件。但是,Spring 本身就可以用 Java 配置代替 XML 配置,和 Spring Boot 有什么关系呢?
  2. Spring Boot 我们用来做 Spring Cloud 微服务,微服务和 Spring Boot 有什么关系?不用 Spring Boot 行不行?
  3. Spring Boot 可以打 jar 包部署,内部集成了Tomcat。但是并不是很多的项目都需要打jar部署,那springboot真正的优点在哪?

为什么我们要用 springboot,我认为 springboot 最重要的功能是:自动配置。以下是我对springboot的理解

创建springboot的项目过程,我就不在叙述了,网上有很多的例子


springboot 主程序类,入口类分析

启动类Application

/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication()
public class SpringBootAdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminApplication.class, args);
    }
}

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

进入 SpringBootApplication 注解

@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的配置类;
标注在某个类上,表示这是一个Spring Boot的配置类;

@Configuration:配置类上来标注这个注解;
配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component

@EnableAutoConfiguration:开启自动配置功能;
以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效;

@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class):
Spring的底层注解@Import,给容器中导入一个组件;
导入的组件由AutoConfigurationPackages.Registrar.class;
将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;
@Import(EnableAutoConfigurationImportSelector.class);
给容器中导入组件?
EnableAutoConfigurationImportSelector:导入哪些组件的选择器;
将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,
并配置好这些组件;

在这里插入图片描述
有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);
Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们;
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;

springboot 配置文件

  1. 配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的;
•application.properties
•application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
以前的配置文件,大多数都使用的是 xxx.xml文件。
springboot 使用的是yml :以数据为中心,比json、xml等更适合做配置文件

--yml配置例子
server:
	port: 8081

--xml配置例子(对比)
<server>
	<port>8081</port>
</server>

2.yml语法

k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

server:
	port: 8081
	path: /hello

属性和值也是大小写敏感;

字面量:普通的值(数字,字符串,布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

对象、Map(属性和值)(键值对):
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式

friends:
	lastName: zhangsan
	age: 20
//第二种写法	
friends: {lastName: zhangsan,age: 18}	

数组(List、Set):
用- 值表示数组中的一个元素

pets:
‐ cat
‐ dog
‐ pig
//第二种写法
pets: [cat,dog,pig]
  1. 配置文件注入
    创建person.yml文件
person:
	lastName: hello
	age: 18
	boss: false
	birth: 2017/12/12
	maps: {k1: v1,k2: 12}
	lists:
	‐ lisi
	‐ zhaoliu
	dog:
		name: 小狗
		age: 12

javaBean:

/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

@Value("${person.last‐name}")
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;

虽然这样注入了,但是我们在正常的开发日程中会出现,注入多个bean的情况,甚至是多个文件中会有相同的属性,springboot 提供了 @PropertySource:加载指定的配置文件;
@PropertySource(value = {“classpath:person.yml”})
当前类只从person下获取值注入。

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
@ImportResource(locations = {“classpath:beans.xml”})
导入Spring的配置文件让其生效

<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring‐beans.xsd">
<bean id="helloService" class="com.atguigu.springboot.service.HelloService"></bean>
</beans>

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
1、配置类@Configuration------>Spring配置文件
2、使用@Bean给容器中添加组件

/**
 1. @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件 
 2. 在配置文件中用<bean><bean/>标签添加组件
*/
@Configuration
public class MyAppConfig {
	//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
	@Bean
	public HelloService helloService02(){
		System.out.println("配置类@Bean给容器中添加组件了...");
		return new HelloService();
	}
}

自动配置原理

springboot 配置文件到底能写什么?怎么写?自动配置原理;
配置文件能配置的属性参照-springboot官方文档

  1. 自动配置原理:
    1). SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
    2). @EnableAutoConfiguration 作用:
    利用EnableAutoConfigurationImportSelector给容器中导入一些组件?
    可以查看selectImports()方法的内容;
    List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
    SpringFactoriesLoader.loadFactoryNames()
    扫描所有jar包类路径下 META‐INF/spring.factories
    把扫描到的这些文件的内容包装成properties对象
    从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器

    3). 每一个自动配置类进行自动配置功能;
    4). 以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;
@Configuration //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties(HttpEncodingProperties.class) //启动指定类的
ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把
HttpEncodingProperties加入到ioc容器中
@ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果
满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnClass(CharacterEncodingFilter.class) //判断当前项目有没有这个类
CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing =
true) //判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的
//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
public class HttpEncodingAutoConfiguration {
	//他已经和SpringBoot的配置文件映射了
	private final HttpEncodingProperties properties;
	
	//只有一个有参构造器的情况下,参数的值就会从容器中拿
	public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
		this.properties = properties;
	}
	@Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取
	@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?
	public CharacterEncodingFilter characterEncodingFilter() {
		CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
		filter.setEncoding(this.properties.getCharset().name());
		filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
		filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
		return filter;
	}

根据当前不同的条件判断,决定这个配置类是否生效?
一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取
的,这些类里面的每一个属性又是和配置文件绑定的;

5).所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类

springboot 的精髓:
1)、SpringBoot启动会加载大量的自动配置类
2)、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这
些属性的值;

  1. @Conditional注解
    作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

@Conditional扩展注解 作用(判断是否满足当前指定条件)

@ConditionalOnJava: 系统的java版本是否符合要求
@ConditionalOnBean: 容器中存在指定Bean;
@ConditionalOnMissingBean: 容器中不存在指定Bean;
@ConditionalOnExpression: 满足SpEL表达式指定
@ConditionalOnClass: 系统中有指定的类
@ConditionalOnMissingClass: 系统中没有指定的类
@ConditionalOnSingleCandidate: 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty: 系统中指定的属性是否有指定的值
@ConditionalOnResource: 类路径下是否存在指定资源文件
@ConditionalOnWebApplication: 当前是web环境
@ConditionalOnNotWebApplication: 当前不是web环境
@ConditionalOnJndi: JNDI存在指定项


springboot 第一篇笔记,其中有很多是网上的一些大神写过的,我自己根据自己的理解进行了整理,技术不是谁的,学到了才是你自己的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值