SpringBoot简介和特点
⼀、SpringBoot
1.什么是SpringBoot
SpringBoot是Spring项⽬中的⼀个⼦⼯程,与我们所熟知的Spring-framework 同属于spring的产品:
我们可以看到下⾯的⼀段介绍:
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss.
Most Spring Boot applications need very little Spring configuration.
翻译⼀下:
Spring Boot你只需要“run”就可以⾮常轻易的构建独⽴的、⽣产级别的spring应⽤。
我们为spring平台和第三⽅依赖库提供了⼀种固定化的使⽤⽅式,使你能⾮常轻松的开始开发你的应⽤程序。⼤部分Spring Boot应⽤只需要很少的配置。
其实⼈们把Spring Boot称为搭建程序的脚⼿架。其最主要作⽤就是帮我们快速的构建庞⼤的spring项⽬,并且尽可能的减少⼀切xml配置,做到开箱即⽤,迅速上⼿,让我们关注于业务⽽⾮配置。
我们可以使⽤SpringBoot创建java应⽤,并使⽤java –jar 启动它,就能得到⼀个⽣产级别的web⼯程。
2.为什么要学习SpringBoot
java⼀直被⼈诟病的⼀点就是臃肿、⿇烦。当我们还在⾟苦的搭建项⽬时,可能Python程序员已经把功能写好了,究其原因主要是两点:复杂的配置
项⽬各种配置其实是开发时的损耗,因为在思考 Spring 特性配置和解决业务问题之间需要进⾏思维切换,所以写配置挤占了写应⽤程序逻辑的时间。
混乱的依赖管理
项⽬的依赖管理也是件吃⼒不讨好的事情。决定项⽬⾥要⽤哪些库就已经够让⼈头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这也是件棘⼿的问题。并且,依赖管理也是⼀种损耗,
添加依赖不是写应⽤程序代码。⼀旦选错了依赖的版本,随之⽽来的不兼容问题毫⽆疑问会是⽣产⼒杀⼿。
⽽SpringBoot让这⼀切成为过去!
3.SpringBoot的特点
1. Spring Boot 主要特征是:
2. 创建独⽴的spring应⽤程序
3. 直接内嵌tomcat、jetty和undertow(不需要打包成war包部署)
4. 提供了固定化的“starter”配置,以简化构建配置
5. 尽可能的⾃动配置spring和第三⽅库
6. 提供产品级的功能,如:安全指标、运⾏状况监测和外部化配置等
7. 绝对不会⽣成代码,并且不需要XML配置
4.启动器
为了让SpringBoot帮我们完成各种⾃动配置,我们必须引⼊SpringBoot提供的⾃动配置依赖,我们称为启动器。spring-boot-starter-parent⼯程将依赖关系声明为⼀个或者多个启动器,我们可以根据项⽬需求引⼊相应的启动器,因为我们是web项⽬,这⾥我们引⼊web启动器:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
5.@EnableAutoConfiguration注解
关于这个注解,官⽹上有⼀段说明:
Enable auto-configuration of the Spring Application Context, attempting to guess and configure bean
s that you are likely to need.
Auto-configuration classes are usually applied based on your classpath and what beans you have defined.
简单翻译以下:
开启spring应⽤程序的⾃动配置,SpringBoot基于你所添加的依赖和你⾃⼰定义的bean,试图去猜测并配置你想要的配置。⽐如我们引⼊了spring-boot-starter-web,
⽽这个启动器中帮我们添加了tomcat、
SpringMVC的依赖。此时⾃动配置就知道你是要开发⼀个web应⽤,所以就帮你完成了web及SpringMVC的默认配置了!
总结,SpringBoot内部对⼤量的第三⽅库或Spring内部库进⾏了默认配置,这些配置是否⽣效,取决于我们是否引⼊了对应库所需的依赖,如果有那么默认配置就会⽣效。
所以,我们使⽤SpringBoot构建⼀个项⽬,只需要引⼊所需依赖,配置就可以交给SpringBoot处理了。
6.@ComponentScan
1. spring框架除了提供配置⽅式的注解扫描<context:component-scan />,还提供了注解⽅式的注解扫描@ComponentScan。
2. 配置组件扫描的指令。提供了类似与<context:component-scan>标签的作⽤
3. 通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描
包及⼦包
4. ⽽我们的@ComponentScan注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其⼦包。⼀般启动类会放在⼀个⽐较浅的
包⽬录中。
7.@SpringBootApplication
在的引导类中使⽤了@EnableAutoConfiguration和@ComponentScan注解,有点⿇烦。springboot提供了⼀种简便的玩法:@SpringBootApplication 注解
发现@SpringBootApplication其实是⼀个组合注解,这⾥重点的注解有3个:
@SpringBootConfiguration
@EnableAutoConfiguration:开启⾃动配置
@ComponentScan:开启注解扫描
8.@SpringBootConfiguration
通过源码我们可以看出,在这个注解上⾯,⼜有⼀个@Configuration注解。
这个注解的作⽤就是声明当前类是⼀个配置类,然后Spring会⾃动扫描到添加了@Configuration的类,并且读取其中的配置信息。
⽽@SpringBootConfiguration是来声明当前类是SpringBoot应⽤的配置类,项⽬中只能有⼀个。所以⼀般我们⽆需⾃⼰添加。
9.默认配置原理
springboot的默认配置⽅式和我们之前玩的配置⽅式不太⼀样,没有任何的xml。那么如果⾃⼰要新增
配置该怎么办?⽐如我们要配置⼀个数据库连接池,以前会这么玩:
<!-- 配置连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
springboot框架的作用</bean>
事实上,在Spring3.0开始,Spring官⽅就已经开始推荐使⽤java配置来代替传统的xml配置了,我们不妨来回顾⼀下Spring的历史:
Spring1.0时代
在此时因为jdk1.5刚刚出来,注解开发并未盛⾏,因此⼀切Spring配置都是xml格式,想象⼀下所有的bean都⽤xml配置,细思极恐啊,⼼疼那个时候的程序员2秒
Spring2.0时代
Spring引⼊了注解开发,但是因为并不完善,因此并未完全替代xml,此时的程序员往往是把xml与注解进⾏结合,貌似我们之前都是这种⽅式。
Spring3.0及以后
3.0以后Spring的注解已经⾮常完善了,因此Spring推荐⼤家使⽤完全的java配置来代替以前的xml,不过似乎在国内并未推⼴盛⾏。然后当
SpringBoot来临,⼈们才慢慢认识到java配置的优雅。
10.java配置
java配置主要靠java类和⼀些注解来达到和xml配置⼀样的效果,⽐较常⽤的注解有:
@Configuration:声明⼀个类作为配置类,代替xml⽂件
@Bean:声明在⽅法上,将⽅法的返回值加⼊Bean容器,代替<bean>标签
@Value:属性注⼊
@PropertySource:指定外部属性⽂件。
jdbc.properties
jdbc.sql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=123
配置数据源
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
解读:
@Configuration:声明JdbcConfiguration是⼀个配置类。
@PropertySource:指定属性⽂件的路径是:classpath:jdbc.properties
通过@Value为属性注⼊值。
通过@Bean将dataSource()⽅法声明为⼀个注册Bean的⽅法,Spring会⾃动调⽤该⽅法,将⽅法的返回值加⼊Spring容器中。相当于以前的bean 标签
然后就可以在任意位置通过@Autowired注⼊DataSource了!
11.SpringBoot的属性注⼊
在上⾯的案例中,我们实验了java配置⽅式。不过属性注⼊使⽤的是@Value注解。这种⽅式虽然可⾏,但是不够强⼤,因为它只能注⼊基本类型值。
在SpringBoot中,提供了⼀种新的属性注⼊⽅式,⽀持各种java基本数据类型及复杂类型的注⼊。
1)配置类
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
// ... 略
// getters 和 setters
}
在类上通过@ConfigurationProperties注解声明当前类为属性读取类
prefix="jdbc"读取属性⽂件中,前缀为jdbc的值。
在类上定义各个属性,名称必须与属性⽂件中jdbc.后⾯部分⼀致,并且必须具有getter和setter⽅法
需要注意的是,这⾥我们并没有指定属性⽂件的地址,SpringBoot默认会读取⽂件名为application.properties的资源⽂件,所以我们把
jdbc.properties名称改为application.properties
2)在JdbcConfiguration中使⽤这个属性:
通过@EnableConfigurationProperties(JdbcProperties.class)来声明要使⽤JdbcProperties这个类的对象
然后你可以通过以下⽅式在JdbcConfiguration类中注⼊JdbcProperties:
1.@Autowired注⼊
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Autowired
private JdbcProperties jdbcProperties;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.Url());
dataSource.DriverClassName());
dataSource.Username());
dataSource.Password());
return dataSource;
}
}
2.构造函数注⼊
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
private JdbcProperties jdbcProperties;
public JdbcConfiguration(JdbcProperties jdbcProperties){
this.jdbcProperties = jdbcProperties;
}
@Bean
public DataSource dataSource() {
// 略
}
}
3.@Bean⽅法的参数注⼊
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Bean
public DataSource dataSource(JdbcProperties jdbcProperties) {
// ...
}
}
12.更优雅的注⼊
事实上,如果⼀段属性只有⼀个Bean需要使⽤,我们⽆需将其注⼊到⼀个类(JdbcProperties)中。⽽是直接在需要的地⽅声明即可:
@Configuration
public class JdbcConfiguration {
@Bean
// 声明要注⼊的属性前缀,SpringBoot会⾃动把相关属性通过set⽅法注⼊到DataSource中
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
}
我们直接把@ConfigurationProperties(prefix = "jdbc")声明在需要使⽤的@Bean的⽅法上,然后SpringBoot就会⾃动调⽤这个Bean(此处是DataSource)的set ⽅法,然后完成注⼊。使⽤的前提是:该类必须有对应属性的set⽅法!
13.静态资源
现在,我们的项⽬是⼀个jar⼯程,那么就没有webapp,我们的静态资源该放哪⾥呢?
源码中有⼀个叫做ResourceProperties的类,⾥⾯就定义了静态资源的默认查路径:
默认的静态资源路径为:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
只要静态资源放在这些⽬录中任何⼀个,SpringMVC都会帮我们处理。
我们习惯会把静态资源放在classpath:/static/⽬录下。我们创建⽬录,并且添加⼀些静态资源:
14.添加
也是我们经常需要使⽤的,在SpringBoot中该如何配置呢?
不是⼀个普通属性,⽽是⼀个类,所以就要⽤到java配置⽅式了。在SpringBoot官⽅⽂档中有这么⼀段说明:
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters,
view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc.
If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.
If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.
翻译:
如果你想要保持Spring Boot 的⼀些默认MVC特征,同时⼜想⾃定义⼀些MVC配置(包括:,格式化器, 视图控制器、消息转换器等等),
你应该让⼀个类实现WebMvcConfigurer,并且添加@Configuration注解,但是千万不要加@EnableWebMvc注解。如果你想要⾃定义HandlerMapping、HandlerAdapter、ExceptionResolver
等组件,你可以创建⼀个WebMvcRegistrationsAdapter实例来提供以上组件。
如果你想要完全⾃定义SpringMVC,不保留SpringBoot提供的⼀切特征,你可以⾃⼰定义类并且添加@Configuration注解和@EnableWebMvc注解
通过实现WebMvcConfigurer并添加@Configuration注解来实现⾃定义部分SpringMvc配置。
实现如下:
⾸先我们定义⼀个:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle method is running!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle method is ru
nning!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion method is running!");
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论