文章目录
- 前言
- 1. 常见的一些概念
- 1.1 POJO(Plain Ordinary Java Object 简单Java对象)
- 1.2 DAO和Mapper
- 2. Java的三层架构
- 2.1 包的层级结构
- 2.2 交互层 controller(用户界面、网页)jsp文件
- 2.3 业务处理层 service
- 2.4 Mapper层
- 3. 注解
- 3.1 @SpringBootApplication
- 3.2 Bean对象的声明
- 3.3 @Autowired
- 3.4 @RequestBody
- 3.5 @ResponseBody
- 3.6 @PathVariable
- 3.7 @RequestParam
- 3.8 @RequestMapping、@GetMapping、@@PostMapping等等
- 3.9 @Configuration
- 3.10 @Import
- 3.11 @Bean
- 3.12 @Transactional
- 3.13 切面
- 3.14 @Slf4j
- 3.15 lombok
- 总结
前言
这段时间在继续沉淀Java后端的东西,看的网课是黑马的23版JavaWeb开发,整体只是把很多知识点过了一遍,发现好多知识点都不明白,加之前面基础不牢,整体感受就是面向注解编程,感觉整个人就稀里糊涂。做完了这个Demo后,我也打算来好好整理一下目前的知识点。
最大的一个感觉就是Java的生态圈是真的庞大,这也是为啥这么多年了Java仍然能在国内市场当老大的原因吧。
1. 常见的一些概念
1.1 POJO(Plain Ordinary Java Object 简单Java对象)
POJO就是一个非常简单的对象,一般只包含一些基本的参数,一般就用来表示数据结构,例如数据库中的表结构。
POJO的内在含义是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的java对象。
它仅包含自身的属性以及自身属性的getter和setter方法,这意味者POJO可以方便的从一个框架迁移到另一个框架中,或者框架升级也会对代码毫无影响,因此而得到复用。
Bean
Bean是POJO的特殊类型,所有的Java Bean都是POJO。
- JavaBean是遵循特定编写规范的Java类,主要用于封装数据。具体来说,一个JavaBean需要满足以下规范:实现Serializable接口以支持序列化;提供一个无参构造函数;使用私有属性存储数据,并提供公共的getter和setter方法访问和修改这些属性;对于值类型的属性,使用私有属性存储数据;对于引用类型的属性,使用私有属性存储对对象的引用,并提供公共的getter和setter方法访问和修改这些引用。
- 相比之下,POJO(Plain Ordinary Java Object)是一种更纯净、简单的Java类或接口。它严格地遵守简单对象的概念,也就是说,POJO主要用于装载数据,作为数据存储的载体,而不具有业务逻辑处理的能力。与JavaBean不同,POJO没有严格的编写规范,只要它包含属性和相应的getter和setter方法,就可以被视为POJO。
(以上资料来自GPT)
1.2 DAO和Mapper
DAO通常是一个接口,它定义了一些数据访问方法,而具体的实现则由其他类来完成;而Mapper则是用于将Java对象与SQL语句进行映射的,它通常是一个XML文件,包含了一些SQL语句和一些与Java对象相关的配置信息。
2. Java的三层架构
Java设计三层架构主要目的还是分层解耦。
- 控制反转:简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想被称为控制反转。
- 依赖注入:简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
- Bean对象:IOC容器中创建、管理的对象,称之为Bean。
2.1 包的层级结构
Java开发的包的层级特别多也特别深,在之前我自己做C++开发的时候,都没有过这种感觉。
这里主要用的是Maven,也是目前最流行的打包方式。
2.2 交互层 controller(用户界面、网页)jsp文件
controller层作为与前端交互的层,主要用来接受请求,并且调用业务层service层。
@Slf4j // 自动生成一个名为log的日志对象
@RequestMapping("/depts")
@RestController // 包含ResponseBody注解,将返回对象直接转为json再响应回来(controller层必要的注解)
public class DeptController {
@Autowired // 自动装配注解,是用来将这个注解下面的对象进行实例化的
private DeptService deptService; // 调用业务逻辑层需要声明相应的业务逻辑层对象
/**
* 查询部门数据
* @return
*/
@GetMapping
public Result list() {
log.info("查询全部部门数据");
// 调用service查询部门数据
List<Dept> deptList = deptService.list();
return Result.success(deptList);
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) { // 前端需要传递的参数
log.info("根据id删除部门:{}", id);
deptService.delete(id);
return Result.success();
}
}
2.3 业务处理层 service
主要作用是:与交互层进行数据传输,调用数据处理层,完成各种业务功能。
首先要有个业务层接口,然后再有实现类。
public interface DeptService {
/**
* 查询全部部门数据
* @return
*/
List<Dept> list();
/**
* 删除部门
* @param id
*/
void delete(Integer id);
/**
* 新增部门
* @param dept
*/
void add(Dept dept);
}
@Service // 这个注解来表明这是个业务逻辑层,到时候自动装配就可以找到这个层
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Autowired
private EmpMapper empMapper;
@Override
public List<Dept> list() {
return deptMapper.list();
}
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) // spring事务管理;默认只有RuntimeException才回滚;这里指定所有异常
public void delete(Integer id) {
deptMapper.deleteById(id);
// int i = 1 / 0;
empMapper.deleteByDeptId(id); // 根据部门id删除员工
}
@Override
public void add(Dept dept) {
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.insert(dept);
}
}
2.4 Mapper层
这一层就是进行数据库的操作了。在这一层,spring有DAO和Mapper两种实现,一般后者用的多一点。
@Mapper // Mapper层要有的东西
public interface DeptMapper {
/**
* 查询全部部门数据
* @return
*/
@Select("select * from dept")
List<Dept> list();
@Delete("delete from dept where id = #{id}")
void deleteById(Integer id);
@Insert("insert into dept (name, create_time, update_time) values(#{name}, #{createTime}, #{updateTime})")
void insert(Dept dept);
}
关于Mapper层和Service层,前者主要负责和数据库打交道,而Service层更多则是业务逻辑的处理,包括事务的添加也在这一层,比如从A扣掉100,再从B加上100,这个过程在Service层打包成了一个事务。
3. 注解
初次学习的时候,接触了太多的注解了,一方面感慨java后端就是面向注解编程,可以帮助我们快速构建应用程序;另一方面觉得对底层认值还不够清晰。这一小节把常用的注解都记录下来总结一下。
3.1 @SpringBootApplication
作用:这是一个组合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。用于标识SpringBoot应用程序的入口类。
- @Configuration:指示这个类是一个配置类,它定义了一个或多个@Bean方法,用于创建和配置Spring应用程序上下文中的Bean。
- @EnableAutoConfiguration:启用Spring Boot的自动配置机制,它会自动添加所需的依赖项和配置,以使应用程序能够运行。
- @ComponentScan:指示Spring Boot扫描当前包及其子包中的所有@Component、@Service、@Repository和@Controller注解的类,并将它们注册为Spring Bean。
@SpringBootApplication注解通常被用于Spring Boot应用程序的入口类上,用于启动Spring Boot应用程序。它可以简化Spring应用程序的配置和启动过程。
3.2 Bean对象的声明
作用:把某个对象交给IOC容器管理。即完成控制反转。
注解 | 说明 | 位置 |
@Component | 声明bean的基础注解 | 不属于以下三类时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Mapper | @Component的衍生注解 | 标注在Mapper上 |
在springboot中,控制类用@RestController,该类不仅包含了@Controller,还可以将返回值类转换为json类型给前端。
3.3 @Autowired
作用:用于自动装配Spring容器中的Bean。即完成依赖注入。
3.4 @RequestBody
作用:用于将HTTP请求的主体转换为方法的参数。@RequestBody是Spring MVC框架中的一个注解,用于将HTTP请求体中的数据绑定到控制器方法的参数上。需要注意,后端pojo类的参数名要与传入的参数名一致。
@RestController
@RequestMapping("/api")
public class UserController {
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// 创建用户
}
}
3.5 @ResponseBody
作用:用于将方法的返回值转换为HTTP响应的主体。@ResponseBody是Spring MVC框架中的一个注解,用于将控制器方法的返回值转换为HTTP响应体中的数据。
3.6 @PathVariable
作用:用于获取URL中的参数值。@PathVariable是Spring MVC框架中的一个注解,用于将HTTP请求路径中的变量绑定到控制器方法的参数上。
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) {
log.info("根据id删除部门:{}", id);
deptService.delete(id);
return Result.success();
}
3.7 @RequestParam
作用:用于获取请求参数的值,如果未声明则参数和变量参数名一样;同时还可以用defaultValue设置默认值。
@GetMapping
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize,
String name, Short gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
log.info("分页查询,参数:{}, {}", page, pageSize);
PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);
return Result.success(pageBean);
}
@RequestParam和@PathVariable不要搞混了。首先,从用法上看,@PathVariable主要用于接收URL路径中的参数,而@RequestParam主要用于接收请求中的参数。例如,当我们希望获取用户的ID时,如果该ID位于URL的路径中,如"/user/123",则可以使用@PathVariable(“userId”)来获取;如果该ID在请求的查询参数中,如"/user?userId=123",则应使用@RequestParam(“userId”)来获取。
3.8 @RequestMapping、@GetMapping、@@PostMapping等等
用于处理HTTP的各种请求。
3.9 @Configuration
作用:用于标识一个类是Spring的配置类。@Configuration是Spring框架中的一个注解,用于标注一个类作为配置类。
3.10 @Import
作用:用于导入其他配置类或Bean。
3.11 @Bean
作用:用于将一个方法返回的对象注册到Spring容器中。@Bean是Spring框架中的一个注解,用于将一个方法返回的对象注册为一个Spring Bean。
3.12 @Transactional
作用:用于指定事务的范围。
3.13 切面
@Aspect
作用:用于定义切面。
@Aspect是Spring框架中的一个注解,用于标识一个类为切面类,从而可以在该类中定义切面逻辑以实现AOP(面向切面编程)。
在Spring框架中,如果需要使用AOP来实现某些功能,我们可以使用@Aspect注解来标识一个类为切面类。在切面类中,我们可以定义切面逻辑,包括切入点、通知类型和切面顺序等,从而实现AOP编程的功能。
同时,我们还使用@Component注解标识这个类,以便Spring框架能够自动将它加入到Spring容器中。
@Pointcut
作用:用于定义切点。
@Pointcut是Spring框架中的一个注解,用于定义一个切入点,从而可以在该切入点上定义通知类型以实现AOP(面向切面编程)。
在Spring框架中,如果需要使用AOP来实现某些功能,我们可以使用@Pointcut注解来定义一个切入点。在切入点上,我们可以定义切面逻辑,包括通知类型和切面顺序等,从而实现AOP编程的功能。@Pointcut("execution(* com.example.UserService.*(..))")
@Before
作用:用于在方法执行前执行通知。
@After
作用:用于在方法执行后执行通知。
@Around
作用:用于在方法执行前后执行通知。
3.14 @Slf4j
作用:用于简化日志记录。
3.15 lombok
@Data
作用:用于自动生成JavaBean的getters、setters、toString、hashCode和equals方法。
@NoArgsConstructor
作用:用于生成无参构造函数。
@AllArgsConstructor
作用:用于生成全参构造函数。