初学Spring Boot

一、Spring Boot       

        Spring Boot是用来简化新Spring应用的初始搭建以及开发过程。不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。(整个Spring技术栈的大整合、J2EE开发的一站式解决方案)

spring Boot优点:

快速创建独立运行的Spring项目以及与主流框架继承。

使用嵌入式的Servlet容器,应用无需打成WAR包

starters自动依赖与版本控制

大量的自动配置,简化开发,也可修改默认配置

无需配置XML,无代码生成,开箱即用

准生产环境的运行时应用监控

与云计算天然集成。

二、Spring Boot——helloworld

2.1,使用idea  sping Initalizr自动创建一个Spring Boot应用:

2.2,spring boot 主程序:

@SpringBootApplication
public class SpringBoot01HelloworldApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringBoot01HelloworldApplication.class, args);
    }
}
@SpringBootApplication:Spring Boot应用标注在某个类上说明是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:spring的注解,配置类上来标注这个注解(配置类==配置文件)
         @Component:配置类也是容器中的一个组件

@EnableAutoConfiguration:开启自动配置功能。以前我们需要配置的东西(比如MVC视图,包扫描等),Spring Boot帮我们自动配置。

我们点进@EnableAutoConfiguration(自动配置注解)可以看到:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自动配置包
    @Import(AutoConfigurationPackages.Registrar.class)
    Spring的底层注解@Import,给容器中导入一个组件,导入的组件由AutoConfigurationPackages.Registrar.class类指定(里面
个方法registerBeanDefinitions,获取)
    将主配置类(@SpringBootConfiguration标注的类)的所在包(com.huawei.springboot)及下面所有子包里面的所有组件扫描到      Spring容器

@Import(AutoConfigurationImportSelector.class):给容器中导入组件;
AutoConfigurationImportSelector.class:决定导入哪些组件;
将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件

有了自动配置类,免去了我们手动编写配置注入功能组件等工作。SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Spring Boot在启动的时候从类路径下的"META-INF/spring.factories"中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作,以前我们需要自己配置的东西,自动配置类都帮我们配置好了。

J2EE的整体整合解决方案和自动配置都在:spring-boot-autoconfigure-2.3.0.RELEASE.jar

三、Spring Boot配置文件

Spring Boot是用一个全局的配置文件,配置文件名是固定的:application.properties、application.yml

作用:修改SpringBoot自动配置的默认值(底层帮我们自动配置好了)

3.1,@value获取值和@configurationProperties获取值比较

@configurationProperties(prefix = "person"):告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定(默认从全局配置文件中获取值)

3.2,@PropertySource和@ImportResource

@PropertySource:加载指定的配置文件

@ImportResource:导入Spring的配置文件(bean.xml),让配置文件里面的内容生效

SpringBoot推荐使用全注解方式,不编写配置文件(由配置类==配置文件)

四、自动配置原理

上文的HelloWorld程序中我们讲到:
@Import(AutoConfigurationImportSelector.class):给容器中导入组件;
AutoConfigurationImportSelector.class:决定导入哪些组件;
将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件;

4.1,我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例讲解自动配置原理:

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ServerProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

	private final Encoding properties;

	public HttpEncodingAutoConfiguration(ServerProperties properties) {
		this.properties = properties.getServlet().getEncoding();
	}

	@Bean
	@ConditionalOnMissingBean
	public CharacterEncodingFilter characterEncodingFilter() {
		CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
		filter.setEncoding(this.properties.getCharset().name());
		filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
		filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
		return filter;
	}

(1)@Configuration:表示这是一个配置类,以前编写的配置文件(bean.xml)一样,也可以给容器中添加组件

(2)@EnableConfigurationProperties:启动指定类的ConfigurationProperties功能,将配置文件中对应的值和ServerProperties绑定起来;并把ServerProperties加入到ioc容器中

(3)@ConditionalOnWebApplication:Spring底层l注解@Conditional,根据不同的条件判断,如果满足指定的条件,整个配置生效。(这里判断的是:当前应用是否为web应用,如果是,当前配置生效)

(4)@ConditionalOnClass(CharacterEncodingFilter.class):判断当前项目有没有这个类;CharacterEncodingFilter(MVC中乱码解决的过滤器)。

(5)@ConditionalOnProperty:判读配置文件中是否存在某个配置

(6)@Bean:给容器中添加一个组件,这个组件的某些值需要从properties中获取

(7)@ConditionalOnMissingBean:判断容器中有没有这个组件

注:我们可以看到HttpEncodingAutoConfiguration 类中只有一个有参构造器,参数(ServerProperties )的值会从ioc容器中拿

所有在配置文件中能配置的属性都是在xxxProperties类中封装着,配置文件能配置什么就可以参照某个功能对应的这个属性类(ServerProperties.class)

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {

ServerProperties.class这个类中所有的属性我们都可以在全局配置文件中(application.properties)配置:以server.X开头(server.X=)

本例总结:根据当前不同条件判断,决定这个配置类是否生效?

一旦这个配置类生效,这个配置类就会给容器中添加各种组件(本例中的filter),这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的。

4.2,SpringBoot精髓

(1)SpringBoot启动会加载大量的自动配置类

(2)我们看我们需要的功能有没有SpringBoot默认写好的自动配置类

(3)我们看这个自动配置类中到底配置了哪些组件(只要我们要用的组件有,我们就不需要再来配置了)

(4)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的值

SpringBoot中所有功能(可参考上面4.1例子):

xxxAutoConfigurartion:自动配置类:给容器中添加组件

xxxProperties:封装配置文件中相关属性

4.3,@Conditional派生注解(Spring原生注解)

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

SpringBoot启动的时候会给我们加载非常多得自动配置类(涵盖了J2EE开发所有功能),但是否生效要满足一定条件。

也就是说:自动配置类必须在一定条件下才能生效

4.4,查看哪些配置类生效

在全局配置文件(application.properties)中配置:debug=true(默认不配置为false),这样启动时控制台就会打印自动配置类哪些生效哪些不生效。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值