spring boot
2023-09-01 15:08:48 19 举报
AI智能生成
d
作者其他创作
大纲/内容
springboot 启动过程
SpringApplication.run(Application.class,args);
* 1,auto configuration完成了所有的配置:spring MVC,spring、tomcat
* 2,会将内嵌的tomcat准备好,同时将我们的这个工程部署到内嵌的tomcat中去
* 3,接着会启动内嵌的一个tomcat
* 4,tomcat启动之后,就会初始化spring的核心容器,是跟spring mvc整合在一起的
* 5,spring核心容器就会扫描所有的包,有没有带@RestController之类的注解,将这个controller初始化
* 6,将我们@Restcontroller注解的类实例化成一个bean,注入自己的spring容器
* 7,此时spring mvc的核心servlet,去对外接收请求的,接收到请求之后,会将请求装发给对应的bean。
* 8,controller bean处理请求,spring mvc将请求结果返回给浏览器
* 2,会将内嵌的tomcat准备好,同时将我们的这个工程部署到内嵌的tomcat中去
* 3,接着会启动内嵌的一个tomcat
* 4,tomcat启动之后,就会初始化spring的核心容器,是跟spring mvc整合在一起的
* 5,spring核心容器就会扫描所有的包,有没有带@RestController之类的注解,将这个controller初始化
* 6,将我们@Restcontroller注解的类实例化成一个bean,注入自己的spring容器
* 7,此时spring mvc的核心servlet,去对外接收请求的,接收到请求之后,会将请求装发给对应的bean。
* 8,controller bean处理请求,spring mvc将请求结果返回给浏览器
spring-boot-starter-parent
有一个<dependencyManagement>声明,对spring boot可以集成的大部分流行第三方依赖,都指定了对应的可以互相兼容的版本
继承spring-boot-starter-parent
spring boot中,使用强制依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
不直接继承spring-boot-starter-parent
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
scope
compile(默认)
依赖的包,会在编译的时候被加入进来
并且在打包(mvn package)的时候也会被加入进来。
provided
在编译和测试的时候有效
在执行(mvn package)进行打包时不会加入
比如, 我们开发一个web应用,在编译时我们需要依赖servlet-api.jar,但是在运行时我们不需要该 jar包
因为这个jar 包已由web服务器提供
如果在打包时又被加入进去,那么就可能产生冲突
system
与provided相同
不过被依赖项不会从maven仓库获取,而是从本地文件系统拿,需要配合systemPath属性使用
<dependency>
<groupId>org.open</groupId>
<artifactId>open-core</artifactId>
<version>1.5</version>
<scope>system</scope>
<systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath>
</dependency>
<groupId>org.open</groupId>
<artifactId>open-core</artifactId>
<version>1.5</version>
<scope>system</scope>
<systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath>
</dependency>
runtime
在运行的时候才会依赖
在编译的时候不会依赖
比如,在编译的时候我们不需要JDBC API的jar包
而在运行的时候我们才需要JDBC驱动包。就可以使用runtime修饰。
test
在测试范围有效,在编译与打包的时候都不会使用这个依赖
import
maven多模块项目结构中,可以使用parent 定义父项目,实现从父项目中继承依赖。但maven只能单继承,即一个项目只能使用一个parent标签定义父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
但是,如果该项目是个maven子模块的话,就会出现问题。由于maven类似java是单继承,不能有两个parent
maven2.9之后的版本引入了一个新的功能,可以实现依赖上的多重继承
这样处理可以使得maven的pom配置更加简洁,同时可以复用这些pom依赖。
scope的import 属性只能在<dependencyManagement> 中使用,表示从其它的pom文件中导入dependency配置。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
type标签的默认值是jar,代表我们依赖导入的是一个jar包,现在我们设置成了pom,说明导入的是一个父模块
import代表把父模块中的jar包导入进来
如果scope是import形式的,那么这个dependency不参与依赖传递。
只是把dependency需要的依赖都取过来,像个占位符一样替换了就行。
import配合类型pom来一起使用。import字面意思就是导入
这里就是字如其意,就是把项目(这个项目也是pom类型的项目)中的在<dependencyManagement>标签的中的依赖导入到当前的pom文件中使用
father项目中import了grandpa的项目,其中绿框内的依赖能在father中使用(不加版本号的使用),蓝框中侧不能
spring-boot-starter-*
spring-boot提供了一些列的starter类依赖,跟流行的常用项目进行整合,比如mybatis、redis、mongodb、elasticsearch,等等
我们只要声明对应的spring-boot-starter-*,就可以直接使用对应版本的依赖,多个依赖的版本都是兼容的。可能就是通过application.properties,注解,少量的配置,就可以快速整合进来一个技术开始使用
Configuration类
spring boot的一个核心思想,就是尽量消除掉各种复杂的xml配置文件,
所以一般建议如果要进行一些配置,可以采用Configuration类,在Java类中做一些配置
所以一般建议如果要进行一些配置,可以采用Configuration类,在Java类中做一些配置
代替了xml文件,比如applicationContext.xml,配合properties或yaml文件使用
而且通常比较好的实践是,就将用来放main方法的Application类,作为Configuration类,所以一般会给Application类加@Configuration注解
如果不想将所有的配置都放在Application类中,也可以使用@Import注解将其他的Configuration类引入进来,或者是依靠@ComponentScan注解自动扫描其他的Configuration类
@ComponentScan注解,启用自动扫描所有的spring bean,同时搭配好@Autowired注解来进行自动装配。
只要按照上面的那个约定,将Application类放在最顶层的包结构中,
使用了@ComponentScan之后,就可以自动扫描和搜索到所有的spring bean,包括了:@Component、@Contorller、@Service、@Repository
只要按照上面的那个约定,将Application类放在最顶层的包结构中,
使用了@ComponentScan之后,就可以自动扫描和搜索到所有的spring bean,包括了:@Component、@Contorller、@Service、@Repository
即使一定要使用一个xml配置文件,建议是用@ImportResource来导入一个xml配置文件
@SpringBootApplication注解
@Configuration、@EnableAutoConfiguration、@ComponantScan三个注解整合
auto configuration,会自动给我们完成一些spring mvc的配置,不需要我们手动去搞一个mvc-servlet.xml配置
@Configuration用在类上面,表明这个是个配置类
@EnableAutoConfiguration则是开启Spring Boot的自动配置功能
@EnableAutoConfiguration
包含@Import(AutoConfigurationImportSelector.class)
从类加载器中查找所有的META-INF/spring.factories,并加载其中实现了@EnableAutoConfiguration的类
spring.factories里面的内容是key=value形式的
@Import(DruidDBConfig.class)
使用@Import就可以将其他的配置管理类导入进来
@Repository用在持久层的接口上,这个注解是将接口的一个实现类交给spring管理。
不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型
@Mapper和@Repository注解的区别
使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
@ServletComponentScan
Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码
@ComponentScan
ComponentScan做的事情就是告诉Spring从哪里找到bean
@ComponentScan的不同写法
1.@ComponentScan({“com.xiao.hui”,“com.xiao.qiang”})或@ComponentScan(basePackages = {“com.xiao.hui”,“com.xiao.qiang”})
2.@ComponentScan(“com.xiao”)或@ComponentScan(value = “com.xiao”)或@ComponentScan(basePackages = { “com.xiao” })
3.@ComponentScan(basePackageClasses=要扫描类.class所在位置的包) 意思是要扫描哪个类所在的包,如@ComponentScan(basePackageClasses=hehe.class),这种写法不如上面的那种写法好,有局限性
包扫描会扫描只要标注了@Controller,@Service,@Repository,@Component这四个注解都会被扫描到容器中。
mybatis-spring-boot-starter
系统启动的时候,首先会去扫描DruidDBConfig类,这就可以将外部的druid连接池配置加载进来,同时初始化出来一个druid连接池的DataSource bean
mybatis-spring-boot-starter接着开始干活儿,
1,发现了一个DataSource bean,就会将其注入SqlSessionFactory,
2,再创建SqlSessionTemplate,接着扫描Mapper接口,将SqlSessionTemplate注入每个Mapper,
3,然后将Mapper放入spring容器中来管理
1,发现了一个DataSource bean,就会将其注入SqlSessionFactory,
2,再创建SqlSessionTemplate,接着扫描Mapper接口,将SqlSessionTemplate注入每个Mapper,
3,然后将Mapper放入spring容器中来管理
spring boot的@ComponantScan注解开始干活儿,
自动扫描所有的bean,依次初始化实例以及注入依赖,
EmployeeServiceImpl(将EmployeeMapper注入其中),
EmployeeCongtroller(将EmployeeServiceImpl注入其中)
自动扫描所有的bean,依次初始化实例以及注入依赖,
EmployeeServiceImpl(将EmployeeMapper注入其中),
EmployeeCongtroller(将EmployeeServiceImpl注入其中)
浏览器发送请求,会先由controlller处理,接着调用service,再调用mapper。mapper底层会基于druid连接池访问到数据库,进行数据操作
spring-boot-starter-web
spring boot就会基于自己的Auto Configuration功能,完成web服务器和spring mvc的自动配置
然后我们上手就可以开发web程序,直接运行main类就可以启动内置的web服务器了
spring boot几大特点
对常用的依赖进行统一的版本约束,让各依赖的版本都可以兼容,通过spring-boot-starter-parent中的dependencyManagement实现
简化配置,内置web容器、Auto Configuration、内置打包插件,都是让你写了代码就能立即运行起来,不需要再进行繁琐的xml配置
spring boot,核心目的就是要简化我们的系统开发,尽量不要配置,基于约定
application.properties
Spring Boot的基础配置
监听端口配置
server.port=9090,启动系统的时候:java -jar target\springboot-demo-1.0.0.jar --server.port=9090
web上下文配置
server.context-path=/springboot-demo
spring boot多环境支持
基于spring boot的profile支持来做,一般是没法完全满足我们的期望的
通常还是基于彻底的maven profile来使用,不同的profile直接对应不同的文件夹,然后mvn pakcage打包的时候,指定对应的profile来打包,将对应环境的配置文件,全部放到src/main/resources下面去
系统读取应用的配置
Environment类
Environment类,可以读取applicaiton.properties、命令行参数、系统参数、操作系统环境变量
@Autowired
private Environment env;
private Environment env;
env.getProperty("server.port", Integer.class);
@Value
直接将外部的配置参数注入到配置管理类中
@ConfigurationProperties
都是server打头的,那么可以一次性将一组配置属性读取到一个配置管理类中
@ConfigurationProperties("server")
@EnableConfigurationProperties
0 条评论
下一页