SpringBoot
springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。
特点specialty:
springboot的特点:
1) 自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。
2) 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
3) 辅助功能
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器tomcat、安全、指标,健康检测、外部配置等。
创建Create:
搭建springboot的项目
新建>
选择Spring Boot
|Spring Initializr
SpringBoot版本3.0以上使用java17
>选择Web中SpringWeb包
(剩下的看需求) Java8配置------------------------------------ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><!--springboot3.0以上必须使用jdk17--><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.ykq</groupId><artifactId>qy174-demo01</artifactId><version>0.0.1-SNAPSHOT</version><name>qy174-demo01</name><description>qy174-demo01</description> <properties><!--java使用版本--><java.version>8</java.version></properties><dependencies><!--web依赖jar--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> <!--单元测试jar--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!--如果下方出现红色可以删除--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project> ```
环境|文件配置:
关于SpringBoot的配置文件和框架使用
常用的配置文件种类:
springboot提供了两种配置文件。不管是哪种他们的前缀都是application
第一种
application.properties
第二种:
application.yml
|application.yaml
如果两个文件同时存在,
properties
优先级更高。#.yml | .yaml文件写入格式(":"后务必跟空格然后再写入值,字符串无须+"") #key: # value: hhh # key2: value server:port: 8088servlet:context-path: /bbb#properties写入格式(字符串无须+"") #key=value #key.key2=value server.port=8080 server.servlet.context-path=/aaa
*包扫描的原理
ssm项目必须加包扫描。而现在
springboot
没有在写包扫描了。自带了包扫描的功能。核心在主类上@SpringBootApplication
上,它是一个复合注解。里面包含:
@EnableAutoConfiguration
开启自动配置,里面包含:
@AutoConfigurationPackage
,
@Import({AutoConfigurationPackages.Registrar.class})
需要导入一个自动配置包的类。加载主类所在的包,并按照该包进行扫描。
@SpringBootApplication @ComponentScan(basePackages = {"com.gzx.demo1.config","com.gzx.demo1.controller"}) //不写该注释默认扫描该文件所在的包,加上该注释指定扫描的包,默认扫描消失; public class Demo1Application { public static void main(String[] args) {SpringApplication.run(Demo1Application.class, args);} }
自动装配原理:
我们原来ssm项目,都需要加载前端控制器
DispatcherServlet
. 而现在的springboot
并没有加载DispatcherServlet
。springboot
具备自动装配的功能。127个自动装配
springboot
启动时,加载了使用@SpringbootApplication
注解的类,该注解是一个符合注解,包含@EnableAutoConfiguration
该注解开启了自动装配功能,该注解也是一个符合注解里面包含@Import({AutoConfigurationImportSelector.class})
,导入AutoConfigurationImportSelector
该类自动装配选择器类,该类会自动加载很多自动装配。每个自动装配会完成对于的自动装配功能protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata){if(!this.isEnabled(annotationMetadata)){return EMPTY_ENTRY;} eles {AnnotationAttrbutes attributes = this. getAttributes(annotationMetadata);//获取所有的自动装配类List<String> configurations = this.getCandidateConfigurations(annotationMetadata,attrbutes);//移除重复的自动装配类configurations= this.removeDuplicates(configurations); Set<String> exclusions = this.getExclusions(annotationMetadata,attributes); this.checkExcludedClasses(configurations,exclusions);//移除排除的自动配置类configurations.removeAll(exclusions);//过滤掉没有使用的starter自动配置configurations = this.getConfigurationClassFilter().filter(configurations); this.fireAutoConfigurationImporEvents(configurations,exclusions); return new AutoConfigurationEntry(configurations,exclusion);} }
*读取配置文件中的内容
我们习惯把一些自己的信息放入配置文件中,便于修改。比如OSS. 支付。 我们还希望通过java代码能够读取到配置文件中自己的信息。
springboot提供了两种方式用于读取springboot配置文件中信息的方式。
第一种: @ConfigurationProperties
使用在类上
@ConfigurationProperties(prefix="前缀")
#配置文件 users.name=hhh users.age=123 users.hobby=swim,basketball@ConfigurationProperties(prefix = "users")//定义读取属性名 @Component//该类的创建spring,而且创建时自动读取配置文件为users的属性 @Data public class User {private String name;private int age;private List<String> hobby; }第二种: @Value
使用在变量上
@Value("${类名.变量名}")
(只能读取基本类型和字符串类型)@RestController public class TestController {//将属性文件中变量给予注释变量@Value("${users.name}")private String name; //访问地址@GetMapping("/user")public String test(){System.out.println(name);return name;} }
*profile多环境配置
自理解:
通过不同的配置文件切换spring配置,再主配置文件中进行便捷切换;
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
profile配置文件
多profile文件方式,yml多文档方式
profile激活方式
配置文件|命令行参数
常用命名方式:
application-(命名).properties [自定义的配置文件]
相同配置依然还是放在application.properties中
application-dev.properties [开发环境的配置文件] application-test.properties [测试环境的配置文件] application-pro.properties [生产环境的配置文件]
激活对应配置文件:
第一种:配置文件内
#激活对应环境的配置文件spring.profiles.active="命名" spring.profiles.active=dev第二种:命令行使用
java –jar xxx.jar --spring.profiles.active=dev
注册web组件|过滤器
自理解
将ssm的xml配置文件改为类中声明使用
web组件表示的就是servlet,filter组件。
创建一个Servlet
public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("经过MyServlet");} } public class MyFilter implements javax.servlet.Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("经过DoFilter");} }
创建一个配置类
@Configuration //表示该类为配置类,等价于之前的xml配置文件 public class MyConfig { @Bean //等价于<bean标签.public ServletRegistrationBean myServlet(){ServletRegistrationBean bean=new ServletRegistrationBean();bean.setServlet(new MyServlet());bean.setName("my");bean.setLoadOnStartup(1);bean.addUrlMappings("/my");return bean;} @Beanpublic FilterRegistrationBean myFilter() {FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new MyFilter());bean.setName("filter");bean.addUrlPatterns("/*");return bean;} }
整合第三方框架:
整合mybatis
引入依赖
<dependencies> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql的驱动依赖 3.--> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis和springboot整合的jar.--> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version> </dependency> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency> </dependencies> 配置文件
spring.application.name=qy174-springboot-mybatis #数据源的信息 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/qy174-springboot?serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root #配置mybatis映射文件的路径 mybatis.mapper-locations=classpath:mapper/*.xml实体类
@Data public class User { private Integer userid; private String username; private String sex; private Integer age; }dao
public interface UserDao { int insert(User user); int delete(Integer id); int update(User user); User select(Integer id); List<User> selectAll(); }映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ykq.dao.UserDao"> <insert id="insert">insert into user(username,age,sex) values(#{username},#{age},#{sex}) </insert> <update id="update">update user set username=#{username},age=#{age},sex=#{sex} where userid=#{userid} </update> <delete id="delete">delete from user where userid=#{id} </delete> <select id="selectById" resultType="com.ykq.entity.User">select * from user where userid=#{id} </select> <select id="selectAll" resultType="com.ykq.entity.User">select * from user </select> </mapper>service
@Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public R selectAll() {List<User> users = userDao.selectAll();return new R(200,"查询成功",users); } @Override public R selectById(Integer id) {User user = userDao.selectById(id);if(user==null){return new R(500,"查询失败",null);}else{return new R(200,"查询成功",user);} } @Override public R insert(User user) {int i = userDao.insert(user);if(i>0){return new R(200,"添加成功",null);}return new R(500,"添加失败",null); } @Override public R update(User user) {int update = userDao.update(user);if (update>0){return new R(200,"修改成功",null);}return new R(500,"修改失败",null); } @Override public R delete(Integer id) {int i = userDao.delete(id);if (i>0){return new R(200,"删除成功",null);}return new R(500,"删除失败",null); } } controller
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/list") public R list() {return userService.selectAll(); } //getById/1 @GetMapping("/getById") public R getById(Integer id) {return userService.selectById(id); } @DeleteMapping("/deleteById") public R deleteById(Integer id) {return userService.delete(id); } @PostMapping("/insert") public R insert(@RequestBody User user) {return userService.insert(user); } @PutMapping("/update") public R update(@RequestBody User user) {return userService.update(user); } } 问题集:
没有为dao生成代理实现类
方法1:
@SpringBootApplication //使用该注释为dao包类内的mapper类生成代理实现类 @MapperScan(basePackages = {"com.gzx.dao"}) public class Demo1Application { public static void main(String[] args) {SpringApplication.run(Demo1Application.class, args);} }方法2:
//在需要生成的mapper类代理实现类中写该注释 @MappingNoClassDefFoundError: 导包异常
java,lang.
NoClassDefFoundError
:org/springframework/aot/AoDetecormybatis和springboot整合的版本太高。
DispatcherServletAutoConfiguration类:
//创建Servlet注册器-[DispatchServlet以及路径] DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,webMvcPrpert...)