Spring Boot 基础了解

Spring

开源框架,为了解决企业级应用开发的复杂性而创建的
如何降低java开发的复杂性
1. 基于POJO的轻量级和最小侵入性程序
2. 通过IOC,依赖注入(DI)和面向接口实现松耦合
3. 基于切面(AOP)和惯例进行声明式编程
4. 通过切面和模板减少样式代码

SPring Boot

一个javaweb的开发框架
简化开发,约定大于配置

SpringApplication

  1. 推断应用类型是普通项目还是Web项目
  2. 查找并加载所有可用初始化器,设置到intializers属性中
  3. 找出所有的应用程序监听器,设置到listeners属性中
  4. 推断并设置main方法的定义类,找到运行的主类

配置文件 yml

在resource下创建一个.yaml文件
SpringBoot使用一个
全局的配置文件,配置文件名是固定的
1. aplication.properties
1. 语法结构:key = value
2. application.yml
1. 语法结构:
key;空格 value**

  1. YAML
    1. YAML Ain't a Markup Language(YAML不是一种置标语言)的递归缩写
    2. Yet Another Markup Language
  2. yaml配置
   server:
    port: 8080

``
保存对象

student:
    name: aab
    age: 7

//行内写法
student: {name: aab, age: 7}

``数组

pets:
    - cat
    - dog
    - pig

//行内写法
pets: [cat,dog,pig]
  1. 给实体类赋值
    我们可以直接在yaml里面定义一些值
    1. 先在实例类里面定义初始值
    2. 然后在yaml文件里面定义
    3. 通过关键字@ConfigurationProperties(prefix = "*")调用yaml文件里面的值
@Component
@ConfigurationProperties(prefix = "person")
public class Person{
    private String name;
    private Intage age;
    private Boolean happy;
    private Data birth;
    private Map<String.Object> maps;
    private List<Object> lists;
    private Dog dog
    
    //无参构造
    public Person(){

    }

    //有参构造
    ...
    //getName,setName....
    String getName() {return name}
    public void setName(String name) {this.name = name;}

}

${random.int} 占位符,int那里可以改

person:
    name: abb${random.uuid} 
    age: ${random.int}
    emotion: false
    birth: 2011/1/1
    maps: {k1: v1,k2: v2}
    hello:hahh //如果有这个那下面就输出hahh
    lists:
     -cook
     -music
     -girl
    dog:
      name: ${person.hello : hello}
      age: 3

如果不给关键字@ConfigurationProperties添加(prefix = "person")就会爆红,但是也不影响程序的运行
最后在测试类里面添加实例

@Autowired
private Person person;

### 数据校验
@Validated
### 配置文件位置
优先级从上到下
1. file:./config/
2. file:./
3. classpath:/config/
4. classpath:/
#### SPringlBoot - 多环境配置 可以选择激活哪一个配置文件
1. properties
首先在resource文件下设置三个配置文件,
    application.properties
    application-dev.properties
    application-test.properties

spring.profiles.active = (-后面的dec或者test)

2. yaml
可以实现多文档模块

server:
port: 8081
spring:
active: dev //选择激活哪个版本


server:
port: 8082
spring:
profiles: dev//取名字


server:
port: 8083
spring:
profiles: test

可以通过**debug=true**查看哪些配置类生效哪些没有生效

# SpringBoot Web开发
    xxxxAutiConfiguration...向容器中自动配置组件
    xxxxProperties 自动配置类,装配配置文件中自定义的一些内容
1. 导入静态资源
2. 首页
3. jsp,模板引擎 Thymeleaf
4. 装配扩展SpringMVC
5. 增删改查
6. 拦截器
7. 中英文切换
## 依赖
一个类(A)需要另一个类(B)来完成它的工作,那么我们就说"类A依赖于类B"

# 通过ide伪造数据库
## 映射 Map
首先我们来了解一下什么是映射
先直到 key,value 它们往往是一对
一个键只能对应一个值,但一个值可以对应多个键
例如
    苹果 -> 水果
    菠萝 -> 水果
    人名 -> 电话号码
    学号 ->学生信息
**映射**就像是一个配对系统或对应关系表,它建立了键(Key)和值(Value)之间的**一一对应关系**
## 创建一个pojo的类 -- 简单的java对象
一个普通的、不受任何特殊限制和约束的类
    1. 不继承特定的类
    2. 不实现特定的接口
    3. 不包含特点的注解
    4. 可以有任何字段和其对应的Getter/Setter:用于常见的形态,用于封装数据
    5. 可以在java任何环境中使用
demo1/pojo.Employee.java

package com.example.demo1.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

//员工表
@Data
@NoArgsConstructor
public class Employee {
private String lastName;
private Integer id;
private String Email;
private Integer gender; // 0 女 1 男
private Department department;
private Date brith;

public Employee(String lastName, Integer id, String email, Integer gender, Department department) {
    this.lastName = lastName;
    this.id = id;
    this.Email = email;
    this.gender = gender;
    this.department = department;
    //默认的日期
    //上面就不用传形参了
    this.brith = new Date();
}

public Employee(String aa, int i, String mail, int i1, Department department1) {
}

}

**@ate**
可以替代一整个类的 Getter、Setter、toString()、equals() 和 hashCode() 方法的编写。
当你在一个类上使用 @Data 注解时,Lombok 会在编译时自动为这个类生成以下内容:
    1. 所有字段的 Getter 方法: 为所有非静态字段生成 getXxx() 方法。
    2. 所有非 final 字段的 Setter 方法: 为所有非静态且非 final 的字段生成 setXxx() 方法。
    3. toString() 方法: 生成一个包含所有类字段及其值的 toString() 方法。
    4. equals() 和 hashCode() 方法: 生成基于所有非静态、非 transient 字段的 equals() 和 hashCode() 方法。这是实现对象逻辑相等和用于基于散列的集合(如 HashMap, HashSet)的关键。
    5. 一个必需的ArgsConstructor: 它会生成一个包含所有final字段和标记了@NonNull且未初始化的字段的构造方法。注意:从Lombok v1.18.4以后,如果你没有写任何构造方法,它还会生成一个无参构造器
   
pojo.Department.java

package com.example.demo1.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//部门表-伪造的
@Data
@AllArgsConstructor //有参构造
@NoArgsConstructor //无参构造
public class Department {
private Integer id;
private String departmentName;
}

## 创建一个Dao类 -- Data Access Object(数据访问对象)
*专门负责与数据打交道的工具对象*
    DAO 的主要作用是在业务逻辑和数据存储之间建立一个隔离层
        业务逻辑层 (Service) → DAO层 → 数据库/数据源
    **具体职责**
        数据的增删改查(CRUD操作)
        封装数据访问细节
        提供统一的数据操作接口
    通常 DAO 的方法名会体现其操作:
        findAll() - 查找所有
        findById() - 根据ID查找
        save() - 保存
        update() - 更新
        delete() - 删除
    作用:
    解耦合
        业务代码不需要知道数据具体存储在哪里(数据库、文件、内存等)
    代码复用
        相同的数据操作逻辑可以在多处复用
        避免在业务代码中重复编写数据访问逻辑      
    维护性
        数据访问逻辑集中在一处,便于维护和优化
### **DepartmentDao**

package com.example.demo1.dao;

import com.example.demo1.pojo.Department;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@Repository
//部门dao
public class DepartmentDao {

//模拟数据库数据
private static Map<Integer, Department> departments = null;
static {
    departments = new HashMap<Integer, Department>(); //创建一个部门表

    departments.put(101, new Department(101,"教学部"));
    departments.put(102, new Department(102,"市场部"));
    departments.put(103, new Department(103,"教研部"));
    departments.put(104, new Department(104,"运营部"));
    departments.put(105, new Department(105,"后勤部"));
}

//获得所有部门信息
public Collection<Department> getDepartments(){
    return departments.values();
}

//通过id得到部门 把id传进去
public Department getDepartmentById(int id){
    return departments.get(id); //类
}

}

补充:
```private static Map<Integer, Department> departments = null;```
**"私有的静态的 整数到部门的映射 部门集合 等于 空值"**
### **Employee**
```@Repository //啥东西 反正就是要注入DepartmentDao就注入这个 被spring托管
public class EmployeeDao {

    //模拟数据库中的数据
    private static Map<Integer, Employee > employees = null;
    //员工所属部门
    @Autowired
    private DepartmentDao departmentDao;
    static {
        employees = new HashMap<Integer, Employee>();

        employees.put(101,new Employee("AA",1001,"1597534682@qq.com",0,new Department(101,"后勤部")) );
        employees.put(102,new Employee("BB",1002,"1592534682@qq.com",0,new Department(102,"教研部")) );
        employees.put(103,new Employee("CC",1003,"1591534682@qq.com",0,new Department(103,"市场部")) );
        employees.put(104,new Employee("DD",1004,"1596534682@qq.com",0,new Department(104,"运营部")) );
        employees.put(105,new Employee("EE",1005,"1594534682@qq.com",0,new Department(105,"后勤部")) );
    }

    //主键自增 增加一个员工
    private static Integer initId = 1006; //init-初始化
    public void save(Employee employee){
        if(employee.getId()==null){
            employee.setId(initId++);
        }

        employee.setDepartment((departmentDao.getDepartmentById(employee.getDepartment().getId())));
        employees.put(employee.getId(),employee);
    }

    //查询全部员工信息
    public Collection<Employee> getAll(){
        return employees.values();
    };

    //通过id查询员工
    public Employee get(Integer id){
        return employees.get(id);
    }

    //通过id删除员工
    public void delete(Integer id){
        employees.remove(id);
    }
}

首页实现

首先在config目录下面的myMVCConfig类
添加一个重写方法,引入ViewControllerRegistry registry形参
然后引用addViewController方法

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
    }

定制跳转首页的路径,可以用多次
然后我们再去index.html修改报错代码
所有页面的静态资源都要使用thymeleaf接管 - @{}
会生成相对于上下文根的绝对路径(例如:/your-app-context/css/style.css
因为我们用的是thymeleaf依赖,所以我们要再导入命名空间
很重要哈
<html lang="en" xmlns:th="http://www.thymeleaf.org">
href、src后面要加th:
在双引号里面加@{....}
assets删掉

首页跳转报错

488行的问题
An error happened during template parsing (template: "class path resource [templates/index.html]" - line 488, col 21)

解决方法

这里原本有两个data-wow-delay,然后我删掉了一个就可以了
但是图片什么的都解析不出来

解决方法 - 因为用了thymeleaf依赖所以:
<link rel="shortcut icon" type="image/x-icon" th:href="assets/images/favicon.png">
href 后面加了th:

首页国际化

确认文件编码都是UTF-8
在resource目录下面创建一个i18n目录 //i18n-国际化
然后建立三个login配置文件
login.properties
login_zh_CN.properties
login_zh_CN.properties
会自动给你把这三个配置文件合并成一个资源包
我们可以直接右键点击资源包,选择新建.将属性文件添加到资源包
再点击右边的+号
如果要加英文资源包就直接填入en_US就行了
现在我们可以在配置文件添加不同的语言配置了
默认配置就在login.properties里填写键值对
看看首页有什么文字 比如password之类的,我们可以这样写

login.tip = 请登录
login.password = 密码

那么中文的配置文件也这样写就好了
接着英文的就是

login.tip = Please sign in
login.password = password

当然,键名随便起也没事
下一步,我们可以跳转到MessageAutoConfigration源码查看如何使用这些配置文件
String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");

        public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
            hints.resources().registerPattern("messages.properties").registerPattern("messages_*.properties");
        }
    }```

反正我就找到这些,就这样,反正就这样
我们在测试配置文件application.properties里配置上面的login.properties
spring.messages.basename=i18n.login
最后我们再在index.html文件里面找到对应的文字,所以键值名还是最好取一样的不然不好找
国际化消息表达式 :#{...}
我们在"按键/或者别的什么其他"后面 空格 th:text="#{login.tip}">(这里就是要被引用配置的字段)</...>
button就把text改成value
如果还是不行就直接把字段改成
[[#{login.tip}]] //.自己设定的键值 两个中括号如何里面写表达式#{...}
这些字段都是黑色的,看到就能认出来了
改了配置文件要重启
写到这里感觉自己像个ai一样我焯


a标签 跳转到某个页面产生变化
如果你的首页有按钮可以改变界面文字语言,找到它 *但是我下载的没有我无语了哈哈哈

posted @ 2025-09-22 17:03  Rich_S  阅读(16)  评论(0)    收藏  举报