Java学习笔记整理: 关于SpringBoot 2024/7/12;

SpringBoot

springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。

特点specialty:

springboot的特点:

1) 自动配置

Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。

2) 起步依赖

起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。

简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

3) 辅助功能

提供了一些大型项目中常见的非功能性特性,如嵌入式服务器tomcat、安全、指标,健康检测、外部配置等。

创建Create:

搭建springboot的项目
  1. 新建>选择Spring Boot|Spring Initializr

  2. SpringBoot版本3.0以上使用java17>选择Web中SpringWeb包(剩下的看需求)

  3. 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并没有加载DispatcherServletspringboot具备自动装配的功能。

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功能就是来进行动态配置切换的。

  1. profile配置文件

    多profile文件方式,yml多文档方式

  2. 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组件。

  1. 创建一个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");
        }
    }

  1. 创建一个配置类
    @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类代理实现类中写该注释
@Mapping
NoClassDefFoundError: 导包异常

java,lang.NoClassDefFoundError:org/springframework/aot/AoDetecor

mybatis和springboot整合的版本太高。

DispatcherServletAutoConfiguration类:

//创建Servlet注册器-[DispatchServlet以及路径]
DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,webMvcPrpert...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值