spring boot
2023-09-01 15:08:48 21 举报
AI智能生成
d
作者其他创作
大纲/内容
springboot 启动过程
SpringApplication.run(Application.class,args);
* 1,auto configuration完成了所有的配置:spring MVC,spring、tomcat<br> * 2,会将内嵌的tomcat准备好,同时将我们的这个工程部署到内嵌的tomcat中去<br> * 3,接着会启动内嵌的一个tomcat<br> * 4,tomcat启动之后,就会初始化spring的核心容器,是跟spring mvc整合在一起的<br> * 5,spring核心容器就会扫描所有的包,有没有带@RestController之类的注解,将这个controller初始化<br> * 6,将我们@Restcontroller注解的类实例化成一个bean,注入自己的spring容器<br> * 7,此时<font color="#ff00ff"><b>spring mvc的核心servlet,去对外接收请求的</b></font>,接收到请求之后,会将请求装发给对应的bean。<br> * 8,controller bean处理请求,spring mvc将请求结果返回给浏览器
<p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:宋体;font-size:12.0000pt;<br>mso-font-kerning:0.0000pt;">spring-boot-starter-parent</span></p>
有一个<dependencyManagement>声明,对spring boot可以集成的大部分流行第三方依赖,都指定了对应的可以互相兼容的版本
继承spring-boot-starter-parent
spring boot中,使用强制依赖<br><parent><br><groupId>org.springframework.boot</groupId><br><artifactId>spring-boot-starter-parent</artifactId><br><version>1.5.9.RELEASE</version><br></parent>
不直接继承spring-boot-starter-parent
<dependencyManagement><br> <dependencies><br> <dependency><br> <!-- Import dependency management from Spring Boot --><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-dependencies</artifactId><br> <version>1.5.9.RELEASE</version><br> <type>pom</type><br> <scope>import</scope><br> </dependency><br> </dependencies><br></dependencyManagement>
scope
compile(默认)
依赖的包,会在编译的时候被加入进来
并且在打包(mvn package)的时候也会被加入进来。
provided
在编译和测试的时候有效
在执行(mvn package)进行打包时不会加入
比如, 我们开发一个web应用,在编译时我们需要依赖servlet-api.jar,但是在运行时我们不需要该 jar包
因为这个jar 包已由web服务器提供
如果在打包时又被加入进去,那么就可能产生冲突
system
与provided相同
不过被依赖项不会从maven仓库获取,而是从本地文件系统拿,需要配合systemPath属性使用
<dependency><br> <groupId>org.open</groupId><br> <artifactId>open-core</artifactId><br> <version>1.5</version><br> <scope>system</scope><br> <systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath><br></dependency>
runtime
在运行的时候才会依赖
在编译的时候不会依赖
比如,在编译的时候我们不需要JDBC API的jar包
而在运行的时候我们才需要JDBC驱动包。就可以使用runtime修饰。
test
在测试范围有效,在编译与打包的时候都不会使用这个依赖
import
maven多模块项目结构中,可以使用parent 定义父项目,实现从父项目中继承依赖。但maven只能单继承,<b><font color="#f44336">即一个项目只能使用一个parent标签定义父项目</font></b>
<parent><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-parent</artifactId><br> <version>1.3.3.RELEASE</version><br></parent>
但是,如果该项目是个maven子模块的话,就会出现问题。由于maven类似java是单继承,不能有两个parent
maven2.9之后的版本引入了一个新的功能,可以实现依赖上的多重继承
这样处理可以使得maven的pom配置更加简洁,同时可以复用这些pom依赖。
scope的<b><font color="#f44336">import 属性只能在<dependencyManagement> 中使用</font></b>,表示<b><font color="#2196f3">从其它的pom文件中导入dependency配置</font></b>。
<dependencyManagement><br> <dependencies><br> <dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-dependencies</artifactId><br> <version>2.1.6.RELEASE</version><br> <b><font color="#f44336"> <type>pom</type><br> <scope>import</scope</font></b>><br> </dependency><br> </dependencies><br></dependencyManagement>
type标签的默认值是jar,代表我们依赖导入的是一个jar包,现在我们<b><font color="#f44336">设置成了pom,说明导入的是一个父模块</font></b>
import代表把父模块中的jar包导入进来
如果scope是import形式的,那么这个dependency不参与依赖传递。
只是把dependency需要的依赖都取过来,像个占位符一样替换了就行。
import配合类型pom来一起使用。import字面意思就是导入
这里就是字如其意,就是把项目(这个项目也是pom类型的项目)中的在<dependencyManagement>标签的中的依赖导入到当前的pom文件中使用
father项目中import了grandpa的项目,其中绿框内的依赖能在father中使用(不加版本号的使用),蓝框中侧不能<br><br>
spring-boot-starter-*
spring-boot提供了一些列的starter类依赖,跟流行的常用项目进行整合,比如mybatis、redis、mongodb、elasticsearch,等等
我们只要声明对应的spring-boot-starter-*,就可以直接使用对应版本的依赖,多个依赖的版本都是兼容的。可能就是通过application.properties,注解,少量的配置,就可以快速整合进来一个技术开始使用
Configuration类
<b><font color="#ff00ff">spring boot的一个核心思想,就是尽量消除掉各种复杂的xml配置文件</font></b>,<br>所以一般建议如果要进行一些配置,可以采用Configuration类,在Java类中做一些配置<br>
代替了xml文件,比如applicationContext.xml,配合properties或yaml文件使用
而且通常比较好的实践是,就将用来放main方法的Application类,作为Configuration类,所以一般会给Application类加@Configuration注解
如果不想将所有的配置都放在Application类中,也可以使用@Import注解将其他的Configuration类引入进来,或者是依靠@ComponentScan注解自动扫描其他的Configuration类
@ComponentScan注解,启用自动扫描所有的spring bean,同时搭配好@Autowired注解来进行自动装配。<br>只要按照上面的那个约定,将Application类放在最顶层的包结构中,<br>使用了@ComponentScan之后,就可以自动扫描和搜索到所有的spring bean,包括了:@Component、@Contorller、@Service、@Repository<br>
即使一定要使用一个xml配置文件,建议是用@ImportResource来导入一个xml配置文件
@SpringBootApplication注解
@Configuration、@EnableAutoConfiguration、@ComponantScan三个注解整合
auto configuration,会自动给我们完成一些spring mvc的配置,不需要我们手动去搞一个mvc-servlet.xml配置
<span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; font-variant-ligatures: common-ligatures;">@Configuration用在类上面,表明这个是个配置类</span>
@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后,<b>不需要在spring配置中设置扫描地址</b>,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。<br>
<b><font color="#f44336">@repository则需要在Spring中配置扫描包地址</font></b>,然后生成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”})
<span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 16px; font-variant-ligatures: common-ligatures;">2.@ComponentScan(“com.xiao”)或@ComponentScan(value = “com.xiao”)或@ComponentScan(basePackages = { “com.xiao” })</span>
3.@ComponentScan(basePackageClasses=要扫描类.class所在位置的包) 意思是要扫描哪个类所在的包,如@ComponentScan(basePackageClasses=hehe.class),这种写法不如上面的那种写法好,有局限性
包扫描会扫描只要标注了@Controller,@Service,@Repository,@Component这四个注解都会被扫描到容器中。
mybatis-spring-boot-starter
系统启动的时候,首先会去扫描DruidDBConfig类,这就可以将外部的druid连接池配置加载进来,同时<font color="#ff00ff">初始化出来一个druid连接池的DataSource bean</font>
mybatis-spring-boot-starter接着开始干活儿,<br>1,发现了一个DataSource bean,就会将其注入SqlSessionFactory,<br>2,再创建SqlSessionTemplate,接着扫描Mapper接口,将SqlSessionTemplate注入每个Mapper,<br>3,然后将Mapper放入spring容器中来管理<br>
spring boot的@ComponantScan注解开始干活儿,<br>自动扫描所有的bean,依次初始化实例以及注入依赖,<br>EmployeeServiceImpl(将EmployeeMapper注入其中),<br>EmployeeCongtroller(将EmployeeServiceImpl注入其中)
浏览器发送请求,会先由controlller处理,接着调用service,再调用mapper。mapper底层会基于druid连接池访问到数据库,进行数据操作
spring-boot-starter-web
spring boot就会基于自己的Auto Configuration功能,完成web服务器和spring mvc的自动配置<br>
然后我们上手就可以开发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<br> private Environment env;
env.getProperty("server.port", Integer.class);
@Value
直接将外部的配置参数注入到配置管理类中
@ConfigurationProperties
都是server打头的,那么可以一次性将一组配置属性读取到一个配置管理类中
@ConfigurationProperties("server")
@EnableConfigurationProperties
0 条评论
下一页