一个spring boot项目解析

1. 准备pom.xml文件内容

负责引入各种包到maven仓库

2. controller层(web层)

实现HelloController类,

与前端交互

@RestController //返回json数据,不跳转路径
public class HelloController{
    @RequestMapping("/hello") //跳转路径hello,绝对路径
    public String say(){
        return "Hello Springboot";
    } 
}

@RestController==@Controller + @ResponseBody

@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上
当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的(即 "/类路径/方法路径");当没有使用 @RequestMapping标记类时,方法的请求地址是绝对路径。
@RequestMapping的地址可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。也可以是通配符来筛选请求地址。
   
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径
格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。
如果要求方法返回json格式数据,而不跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标@ResponseBody。


  • @Bean Bean是什么?

Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);

2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;

3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;

4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了

5、我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean


  • 注解分为两类:

1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;可以被使用在属性域,方法,构造函数上(被调用)。

2、一类是注册Bean, @Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。上面的注解都是将被依赖的bean注入进入,而这几个注解的作用都是生产bean, 这些注解都是注解在类上,将类注解成spring的bean工厂中一个一个的bean(生成bean对象)。


  • Bean的初始化方法

功能:

@Controller 处理http请求

@RestController Spring4之后新加的注解,原来返回json需要@ResponseBody配合@Controller

@RequestMapping 配置url映射

3. 属性配置

resources包下的application.properties或application.yml文件

可以方便变量赋值,在配置文件中实例化,不用频繁更改代码文件。

  • application.yml
server:
  port: 8081
  context-path: /springboot
user:
  name: 小胖
  age: 22

配置端口号;访问前缀;JPA;数据库;等信息

在HelloController中获取配置文件中的信息。

....
@RestController
public class HelloController {

    @Value("${name}")//获取命名为name的配置信息值,实例化变量name
    private String name;

    @RequestMapping(value = "/hello",method = RequestMethod.GET)//在映射路径下显示name(小胖)
    public String say(){
        return name;
    }
}

spring boot 简化@RequestMapping(value="",method=)

@GetMapping(value = "/girls") //获取女生列表
@PostMapping(value = "/girls") //创建一个女生
@PutMapping(value = "/girls/{id}")//通过id更新一个女生
@DeleteMapping(value = "/girls/{id}")//通过id删除一个女生

4. entity层(Bean层,model层)

数据库表的映射实体类,存放pojo对象(POJO(PlainOldJavaObjects)简单的Java对象)

  • 一般的实体类对应一个数据表,其中的属性对应数据表中的字段。
  • 说白了就是为了让程序员在对数据库操作的时候不用写SQL语句 ,一个数据库表生成一个类
  • 实体类就是把对某一个表的操作全写在一个类中.(get,set 获得与修改数据库表)
package com.example.test.bean;
 
public class UserBean {
    private int id;
    private String name;
    private String password;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
}

JPA对象关系映射:

在pom中引入jpa包,并在application中配置信息。可以写好实体类后,通过注解自动映射到数据库产生数据表。(本项目暂时还没使用哈)

5. DAO层

包括XxxDao.java(数据库访问接口类),【XXXDAOImpl.java(数据库方法实现)】可省,XxxDao.xml(数据库链接实现);(这个命名,有人喜欢用Dao命名,有人喜欢用Mapper)

Dao的作用是封装对数据库的访问:增删改查,不涉及业务逻辑,只是达到按某个条件获得指定数据的要求

  • 数据库访问接口类

定义了所有的用户操作,如增删改查;

import java.util.*;
public interface UserDAO {
    
    UserBean getInfo(String name,String password);
    public UserBean queryById(int userid) throws Exception;
    public List<UserBean> queryAll() throws Exception;
}
  • 数据库实现类【可省,由插件实现】
public class UserDAOImpl implements UserDAO {

    @Override
    public UserBean queryById(int userid) throws Exception {
        // TODO Auto-generated method stub
        UserBean user=null;
        String sql="select * from user where userid=?";
        PreparedStatement preparedStatement=null;
        DataBaseConnection dataBaseConnection=null;
        try{
            dataBaseConnection=new DataBaseConnection();
            preparedStatement=dataBaseConnection.getConnection().prepareStatement(sql);
            ResultSet rSet=preparedStatement.executeQuery();
            if(rSet.next()){
                user=new UserBean();
                user.setUserId(rSet.getInt(1));
                user.setUserName(rSet.getString(2));
                user.setPassword(rSet.getString(3));
            }
            rSet.close();
            preparedStatement.close();
        }
        catch(Exception e){
            throw new Exception("操作出现异常");
        }finally {
            dataBaseConnection.close();
        }
        return user;
    }

    @Override
    public List<UserBean> queryAll() throws Exception {
        // TODO Auto-generated method stub
        List<UserBean> all=new ArrayList<UserBean>();
        String sql="select * from user";
        PreparedStatement preparedStatement=null;
        DataBaseConnection dataBaseConnection=null;
        try{
            dataBaseConnection=new DataBaseConnection();
            preparedStatement=dataBaseConnection.getConnection().prepareStatement(sql);
            ResultSet rSet=preparedStatement.executeQuery();
            if(rSet.next()){
                UserBean user=new UserBean();
                user=new User();
                user.setUserId(rSet.getInt(1));
                user.setUserName(rSet.getString(2));
                user.setPassword(rSet.getString(3));
                all.add(user);
            }
            rSet.close();
            preparedStatement.close();
        }
        catch(Exception e){
            throw new Exception("操作出现异常");
        }finally {
            dataBaseConnection.close();
        }
        return all;
    }

}
  • 数据库实现文件(与接口类进行绑定)

需在resource包/mapper/UserMapper.xml实现.在application配置文件中mybatis:mapper-locations:对应的就是该文件地址),注意标签的namespace属性要填写 访问数据库接口类文件路径:

<?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.example.test.mapper.UserMapper">
 
    <select id="getInfo" parameterType="String" resultType="com.example.test.bean.UserBean">
        SELECT * FROM user WHERE name = #{name} AND password = #{password}
    </select>
 
</mapper>

6. service层

也叫服务层,业务层,包括XxxService.java(业务接口类),XxxServiceImpl.java(业务实现类);(可以在service文件夹下新建impl文件放业务实现类,也可以把业务实现类单独放一个文件夹下,更清晰)

  • 调用DAO层接口,接收DAO层返回的数据,实现功能。
    将复杂的业务转化成多个DAO调用操作,调用DAO获取数据,并将行为封装为结果。
  • service业务接口类编写
package com.example.test.service;
 
import com.example.test.bean.UserBean;
 
public interface UserService {
 
    UserBean loginIn(String name,String password);
 
}
  • service业务实现类编写,注意使用注解
package com.example.test.serviceImpl;
 
import com.example.test.bean.UserBean;
import com.example.test.mapper.UserMapper;
import com.example.test.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class UserServiceImpl implements UserService {
 
    //将DAO注入Service层
    @Autowired
    private UserMapper userMapper;
 
    @Override
    public UserBean loginIn(String name, String password) {
        return userMapper.getInfo(name,password);
    }
}

7. 添加一个新功能

修改html,添加新功能选项——》调用controller层,在controller中添加新功能对应的方法及变量(注释到路径)——》调用service层,添加新方法接口,并在实现类中实现该方法(调用DAO层)。

8. 总结图谱

springboot各层的先后顺序 springboot各层结构_spring

图片来自:

crud增删改查。。