文章目录

  • 前言
  • 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设计三层架构主要目的还是分层解耦。

java 组件里面有个ControllerAdvice但是并不像使用 java controller和service_Java

  • 控制反转:简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想被称为控制反转。
  • 依赖注入:简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • Bean对象:IOC容器中创建、管理的对象,称之为Bean。

2.1 包的层级结构

Java开发的包的层级特别多也特别深,在之前我自己做C++开发的时候,都没有过这种感觉。

这里主要用的是Maven,也是目前最流行的打包方式。

java 组件里面有个ControllerAdvice但是并不像使用 java controller和service_java_02

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
作用:用于生成全参构造函数。