java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > maven到springboot

从Maven到Spring Boot实战教程

作者:烟秋时

本文系统梳理了Java后端开发的核心技术栈,从Maven项目管理到Spring Boot实战,从MyBatis持久层到Spring MVC Web开发,涵盖了项目开发的全流程与关键知识点,感兴趣的朋友跟随小编一起看看吧

Java后端核心技术全解析:从Maven到Spring Boot实战

在Java后端开发领域,Maven、Spring、MyBatis等技术构成了核心技术栈。本文将系统梳理这些关键技术的核心概念与实战技巧,结合项目开发场景补充实用细节,助力开发者快速构建高效稳定的后端应用。

一、项目管理利器:Maven核心详解

Maven作为Apache旗下的开源项目管理工具,以标准化的构建流程和依赖管理能力成为Java开发的标配。

1.1 核心功能与优势

Maven的核心价值体现在两大维度:

1.2 仓库体系与POM核心配置

Maven通过三级仓库实现依赖的高效获取:

pom.xml作为Maven项目的核心配置文件,关键配置项包括:

<!-- 项目坐标:唯一标识一个Maven项目 -->
<groupId>com.company.project</groupId>
<artifactId>demo-service</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging> <!-- 打包类型:jar/war/pom -->
<!-- 依赖管理 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>

1.3 依赖冲突解决方案

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>logback-classic</groupId>
            <artifactId>ch.qos.logback</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用Maven Helper插件:在IDEA中安装插件可直观查看依赖树,快速定位冲突源头。

二、Spring生态核心:IOC与AOP

Spring框架以IOC(控制反转)和AOP(面向切面编程)为核心,极大简化了JavaEE开发。

2.1 IOC容器与Bean管理

IOC容器是Spring的灵魂,负责Bean的创建、装配与生命周期管理。

2.1.1 Bean的配置方式对比
配置方式实现方式适用场景
XML配置<bean id="" class="" />早期项目或复杂配置场景
注解配置@Component@Service主流开发模式,简化配置
Java配置类@Configuration + @Bean第三方组件集成
2.1.2 Bean的生命周期(完整版)
  1. 实例化:调用无参构造器创建Bean对象
  2. 属性填充:注入依赖的Bean(setter方法)
  3. 初始化前置BeanPostProcessor.postProcessBeforeInitialization
  4. 初始化
    1. 执行@PostConstruct注解方法
    2. 调用InitializingBean.afterPropertiesSet()
    3. 执行init-method配置的方法
  5. 初始化后置BeanPostProcessor.postProcessAfterInitialization
  6. 使用阶段:从容器中获取并使用Bean
  7. 销毁阶段
    1. 执行@PreDestroy注解方法
    2. 调用DisposableBean.destroy()
    3. 执行destroy-method配置的方法
2.1.3 循环依赖解决方案

Spring通过三级缓存机制解决单例Bean的循环依赖问题:

注意:构造器注入的循环依赖无法解决,需改用字段注入或Setter注入;原型Bean的循环依赖也不被支持。

2.2 依赖注入(DI)的实现方式

Setter注入:通过setXxx()方法注入,支持可选依赖

<bean id="userService" class="com.demo.service.UserService">
    <property name="userMapper" ref="userMapper"/>
</bean>

构造器注入:通过带参构造器注入,强制依赖必须存在

@Service
public class UserService {
    private final UserMapper userMapper;
    @Autowired // Spring 4.3+可省略
    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

注解注入@Autowired(按类型)、@Resource(按名称)、@Value(字面值)

2.3 AOP核心概念与实践

AOP(面向切面编程)用于解决系统横切关注点(如日志、事务、权限)的复用问题。

2.3.1 核心术语
2.3.2 注解式AOP实现

导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

编写切面类

@Aspect
@Component
public class LogAspect {
    // 切入点:匹配所有service方法
    @Pointcut("execution(* com.demo.service.*.*(..))")
    public void servicePointcut() {}
    // 前置通知
    @Before("servicePointcut()")
    public void before(JoinPoint joinPoint) {
        String method = joinPoint.getSignature().getName();
        System.out.println("方法" + method + "开始执行");
    }
    // 环绕通知
    @Around("servicePointcut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = pjp.proceed(); // 执行目标方法
        long time = System.currentTimeMillis() - start;
        System.out.println("方法执行耗时:" + time + "ms");
        return result;
    }
}

三、Spring Boot实战:约定大于配置

Spring Boot简化了Spring应用的搭建与开发,通过自动配置和 starter 依赖实现"开箱即用"。

3.1 自动配置原理深度解析

@SpringBootApplication是核心注解,包含三个关键子注解:

  1. @SpringBootConfiguration:标识配置类,等同于@Configuration
  2. @ComponentScan:扫描主类所在包及其子包的组件
  3. @EnableAutoConfiguration:开启自动配置,核心是@Import(AutoConfigurationImportSelector.class)

自动配置流程:

  1. 扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
  2. 根据类路径下的依赖(starter)按需加载自动配置类
  3. 通过@Conditional系列注解判断是否需要配置
  4. 绑定配置文件(application.yml)中的属性值

3.2 配置文件详解与读取

3.2.1 YAML配置示例
# 服务器配置
server:
  port: 8080
  servlet:
    context-path: /demo
# 数据库配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useSSL=false
    username: root
    password: 123456
# 自定义配置
app:
  name: demo-app
  version: 1.0.0
  features:
    - log
    - security
3.2.2 配置读取方式

@Value注解:读取单个配置值

@RestController
public class AppController {
    @Value("${app.name}")
    private String appName;
}

Environment对象:动态获取配置

@Autowired
private Environment env;
public String getAppVersion() {
    return env.getProperty("app.version");
}

@ConfigurationProperties:批量绑定配置

@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private String name;
    private String version;
    private List<String> features;
    // getter/setter
}

3.3 多环境配置与切换

  1. 创建环境配置文件
    1. 开发环境:application-dev.yml
    2. 测试环境:application-test.yml
    3. 生产环境:application-prod.yml
  2. 激活指定环境
    1. 配置文件方式:spring.profiles.active=dev
    2. 命令行方式:java -jar demo.jar --spring.profiles.active=prod
    3. IDE启动参数:--spring.profiles.active=test

3.4 定时任务实现与Cron表达式

3.4.1 定时任务配置
@Service
public class ScheduledService {
    // 每5秒执行一次
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() {
        System.out.println("固定频率任务执行:" + new Date());
    }
    // 每天凌晨2点执行
    @Scheduled(cron = "0 0 2 * * ?")
    public void cronTask() {
        System.out.println("定时任务执行:" + new Date());
    }
}
3.4.2 Cron表达式验证工具

Cron表达式易出错,可通过代码验证:

public class CronValidator {
    public static void main(String[] args) throws ParseException {
        String cron = "0 0 2 * * ?";
        CronExpression exp = new CronExpression(cron);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        // 打印未来5次执行时间
        for (int i = 0; i < 5; i++) {
            now = exp.getNextValidTimeAfter(now);
            System.out.println(sdf.format(now));
        }
    }
}

四、MyBatis持久层实战

MyBatis是优秀的半自动化ORM框架,支持XML和注解两种映射方式。

4.1 核心配置与开发规范

4.1.1 Mapper代理开发规范
  1. Mapper接口的全路径与Mapper.xml的namespace一致
  2. 接口方法名与XML中sql标签的id一致
  3. 方法参数类型与parameterType一致
  4. 方法返回值类型与resultType/resultMap一致
4.1.2 分页实现(PageHelper)

导入依赖(2025年最新稳定版):

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>

分页查询代码:

public PageInfo<User> getUserPage(int pageNum, int pageSize) {
    // 设置分页参数
    PageHelper.startPage(pageNum, pageSize);
    // 执行查询
    List<User> users = userMapper.selectAll();
    // 封装分页结果
    return new PageInfo<>(users);
}

4.2 动态SQL与SQL片段

动态SQL解决了SQL拼接的繁琐问题,常用标签包括ifwhereforeachchoose等。

4.2.1 动态SQL示例(条件查询)
<select id="selectUserByCondition" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null and name != ''">
            AND name LIKE concat('%', #{name}, '%')
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="ids != null and ids.size() > 0">
            AND id IN
            <foreach collection="ids" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </if>
    </where>
</select>
4.2.2 SQL片段复用
<!-- 定义SQL片段 -->
<sql id="userColumns">
    id, name, age, create_time, update_time
</sql>
<!-- 引用SQL片段 -->
<select id="selectUserById" resultType="User">
    SELECT <include refid="userColumns"/> FROM user WHERE id = #{id}
</select>

4.3 #{}与${}的核心区别

特性#{}${}
本质预编译参数占位符字符串替换
SQL注入可防止有风险
类型转换自动转换需手动处理
使用场景传递参数值(如条件值)动态表名、列名(可信场景)

示例

五、Spring MVC与Web开发

Spring MVC是Spring生态的Web框架,基于MVC模式实现请求处理。

5.1 请求处理核心组件

  1. DispatcherServlet:前端控制器,统一接收请求并分发
  2. HandlerMapping:映射请求到处理器(Controller方法)
  3. HandlerAdapter:适配处理器执行
  4. ViewResolver:解析视图(已被前后端分离模式弱化)
  5. HandlerExceptionResolver:处理异常

5.2 常用请求注解详解

注解作用示例
@RequestMapping映射请求路径和方法@RequestMapping(“/user”, method = RequestMethod.GET)
@GetMapping处理GET请求(派生注解)@GetMapping(“/user/{id}”)
@PostMapping处理POST请求(派生注解)@PostMapping(“/user”)
@PathVariable获取路径参数public User getById(@PathVariable Long id)
@RequestParam获取请求参数public List list(@RequestParam(required = false) String name)
@RequestBody接收JSON请求体public void save(@RequestBody User user)

5.3 全局异常处理

@RestControllerAdvice // 全局异常处理器
public class GlobalExceptionHandler {
    // 处理业务异常
    @ExceptionHandler(BusinessException.class)
    public Result<?> handleBusinessException(BusinessException e) {
        return Result.fail(e.getCode(), e.getMessage());
    }
    // 处理系统异常
    @ExceptionHandler(Exception.class)
    public Result<?> handleSystemException(Exception e) {
        log.error("系统异常", e);
        return Result.fail(500, "系统繁忙,请稍后再试");
    }
}
// 自定义业务异常
public class BusinessException extends RuntimeException {
    private Integer code;
    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }
    // getter
}
// 统一响应结果
public class Result<T> {
    private Integer code;
    private String message;
    private T data;
    // 成功/失败静态方法
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage("success");
        result.setData(data);
        return result;
    }
    public static <T> Result<T> fail(Integer code, String message) {
        // 实现省略
    }
}

5.4 跨域问题解决方案

5.4.1 局部跨域(@CrossOrigin)
@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "http://localhost:8081", maxAge = 3600)
public class UserController {
    // 接口实现
}
5.4.2 全局跨域(配置类)
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 所有路径
                .allowedOrigins("http://localhost:8081") // 允许的源
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的方法
                .allowedHeaders("*") // 允许的请求头
                .allowCredentials(true) // 允许携带cookie
                .maxAge(3600); // 预检请求缓存时间
    }
}

六、项目开发全流程与最佳实践

6.1 标准开发流程

  1. 需求分析与设计
    1. 业务需求梳理
    2. 数据库表设计(ER图)
    3. 接口文档编写(Swagger)
  2. 项目初始化
    1. 创建Spring Boot项目(选择starter:web、mybatis、mysql等)
    2. 配置多环境(dev/test/prod)
    3. 集成常用工具(Lombok、PageHelper、Swagger)
  3. 分层开发
    1. Entity层:与数据库表映射(使用@Data简化代码)
    2. Mapper层:数据访问接口+XML映射文件
    3. Service层:业务逻辑处理(接口+实现类)
    4. Controller层:请求处理与响应
  4. 测试与部署
    1. 单元测试(JUnit5 + Mockito)
    2. 集成测试(@SpringBootTest
    3. 打包部署(Jar包 + Docker)

6.2 常用开发工具集成

6.2.1 Lombok简化实体类

导入依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

使用注解:

@Data // 包含getter、setter、toString、equalsAndHashCode、RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
@TableName("user") // MyBatis-Plus表名注解
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
6.2.2 Swagger接口文档

导入依赖:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.3.0</version>
</dependency>

配置类:

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Demo API")
                        .version("1.0")
                        .description("接口文档"));
    }
}

访问地址:http://localhost:8080/swagger-ui/index.html

七、总结

本文系统梳理了Java后端开发的核心技术栈,从Maven项目管理到Spring Boot实战,从MyBatis持久层到Spring MVC Web开发,涵盖了项目开发的全流程与关键知识点。掌握这些技术不仅能提高开发效率,更能构建出高可维护、高扩展性的后端系统。

在实际开发中,应注重以下几点:

  1. 遵循"约定大于配置"原则,减少重复配置
  2. 善用设计模式解决共性问题(如单例、工厂、代理)
  3. 重视代码规范与测试,提高代码质量
  4. 持续学习新技术(如Spring Cloud微服务、响应式编程)

希望本文能为Java后端开发者提供有价值的参考,助力大家在技术道路上不断进阶!

到此这篇关于从Maven到Spring Boot实战的文章就介绍到这了,更多相关maven到springboot内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文