spring boot项目结构解析
一个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:对应的就是该文件地址),注意
<?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. 总结图谱
图片来自:https://www.cnblogs.com/tooyi/p/13340374.html
crud增删改查。。
参考文献: