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: 8088 servlet: 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 { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("经过MyServlet"); } } public class MyFilter implements javax.servlet.Filter { @Override public 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; } @Bean public 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 mapper PUBLIC "-//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...)