深入理解Spring Boot:Bean管理、原理解析与Maven高级应用
深入理解Spring Boot:Bean管理、原理解析与Maven高级应用
前言
大家好,今天我们来聊聊Spring Boot的核心内容,包括Bean管理、Spring Boot的工作原理以及Maven的高级应用。这些内容不仅是Spring Boot的基础,也是我们在实际项目中经常会遇到的问题。希望通过这篇文章,能让大家对Spring Boot有一个更深入的理解。
一、Bean管理
1.1 什么是Bean?
在Spring中,Bean是指由Spring IoC容器管理的对象。简单来说,Bean就是一个由Spring框架实例化、组装和管理的对象。
1.2 Bean的生命周期
Bean的生命周期包括以下几个阶段:
- 实例化:Spring容器通过反射机制创建Bean实例。
- 属性赋值:Spring容器将配置文件中的属性值或注解中的属性值注入到Bean中。
- 初始化:如果Bean实现了
InitializingBean接口,会调用afterPropertiesSet()方法;如果配置了init-method,会调用指定的初始化方法。 - 使用:Bean被应用程序使用。
- 销毁:如果Bean实现了
DisposableBean接口,会调用destroy()方法;如果配置了destroy-method,会调用指定的销毁方法。
1.3 Bean的作用域
Spring提供了多种Bean作用域,常用的有以下几种:
- singleton:默认作用域,整个Spring IoC容器中只有一个Bean实例。
- prototype:每次请求都会创建一个新的Bean实例。
- request:每个HTTP请求都会创建一个新的Bean实例,适用于Web应用。
- session:每个HTTP会话都会创建一个新的Bean实例,适用于Web应用。
1.4 代码示例
下面是一个简单的Bean定义和使用示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
public class MyBean {
public void doSomething() {
System.out.println("Doing something...");
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyBean myBean = context.getBean(MyBean.class);
myBean.doSomething();
}
}
二、Spring Boot原理
2.1 自动配置
Spring Boot的自动配置是其核心特性之一。它通过@EnableAutoConfiguration注解和一系列的AutoConfiguration类来实现自动配置。Spring Boot会根据类路径中的依赖、配置文件中的属性等条件,自动配置Spring应用的各个方面。
2.2 条件注解
Spring Boot使用了一些条件注解来实现自动配置,例如:
@ConditionalOnClass:当类路径中存在指定的类时,配置才会生效。@ConditionalOnMissingBean:当Spring容器中不存在指定的Bean时,配置才会生效。@ConditionalOnProperty:当配置文件中存在指定的属性时,配置才会生效。
2.3 代码示例
下面是一个简单的自动配置示例:
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnClass(name = "com.example.MyService")
public class MyAutoConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
public class MyService {
public void serve() {
System.out.println("Serving...");
}
}
三、Maven高级应用
3.1 多模块项目
在实际项目中,我们经常会使用Maven来管理多模块项目。多模块项目可以将不同的功能模块分开管理,提高代码的可维护性和可重用性。
3.2 依赖管理
Maven的依赖管理功能非常强大,可以通过<dependencyManagement>标签来统一管理项目的依赖版本,避免版本冲突。
3.3 插件使用
Maven提供了丰富的插件,可以通过插件来实现各种构建任务,例如编译、打包、测试等。
3.4 代码示例
下面是一个简单的多模块项目示例:
<!-- 父POM文件 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.4</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<!-- 子模块A的POM文件 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>module-a</artifactId>
</project>
<!-- 子模块B的POM文件 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>module-b</artifactId>
</project>
总结
通过这篇文章,我们深入探讨了Spring Boot的Bean管理、工作原理以及Maven的高级应用。希望这些内容能帮助大家更好地理解和使用Spring Boot。如果你有任何问题或建议,欢迎在评论区留言,我们一起交流学习!
感谢大家的阅读,我们下次再见!
百万大学生都在用的AI写论文工具,篇篇无重复: AI写论文
深入理解Spring Boot:Bean管理、原理解析与Maven高级应用的更多相关文章
- Spring Boot系列(二):Spring Boot自动装配原理解析
一.Spring Boot整合第三方组件(Redis为例) 1.加依赖 <!--redis--> <dependency> <groupId>org.springf ...
- 从源码中理解Spring Boot自动装配原理
个人博客:槿苏的知识铺 一.什么是自动装配 SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot在启动时会扫描外部引用jar包中的META-INF/spring.factori ...
- Spring Boot自动配置原理与实践(一)
前言 Spring Boot众所周知是为了简化Spring的配置,省去XML的复杂化配置(虽然Spring官方推荐也使用Java配置)采用Java+Annotation方式配置.如下几个问题是我刚开始 ...
- Spring Boot自动配置原理(转)
第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot- ...
- Spring Boot自动配置原理与实践(二)
前言 在之前的博文(Spring Boot自动配置原理与实践(一))中,已经介绍了Spring boot的自动配置的相关原理与概念,本篇主要是对自动配置的实践,即自定义Starter,对原理与概念加深 ...
- 通过BeanPostProcessor理解Spring中Bean的生命周期
通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 Spring源码解析(十一)Spring扩展接口InstantiationAwareBeanPostProces ...
- (4)Spring Boot使用别的json解析框架【从零开始学Spring Boot】
此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boot完美使用FastJson解析JSON数据[从零开始学Spring Boot] http://412887952-qq-co ...
- 峰哥说技术:06-手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 06 峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理 Sp ...
- 【Java面试】如何理解Spring Boot中的Starter?
一个工作了3年的Java程序员,遇到一个Spring Boot的问题. 他对这个问题有一些了解,但是回答得不是很好,希望参考我的高手回答. 这个问题是:"如何理解Spring Boot中的S ...
- Spring Boot事务管理(上)
摘要 本文主要介绍基于Spring Boot的事务管理,尤其是@Transactional注解详细用法.首先,简要介绍Spring Boot中如何开启事务管理:其次,介绍在Spring,Spring ...
随机推荐
- 一篇文章让你读懂Java异常栈信息
一. 基本的异常打印 public class Test { public static void main(String[] args) { fun1();//第4行 } public static ...
- vim快捷键之复制粘贴
yy: 复制光标所在行 p: 将复制的内容粘贴到光标所在行的下一行 P: 将复制的内容粘贴到光标所在行的上一行
- go encoding/json 替代者
https://github.com/json-iterator/go 可以替代官方包encoding/json 提升json编码和解码效率
- 自动化测试在 Kubernetes Operator 开发中的应用:以 OpenTelemetry 为例
背景 最近在给 opentelemetry-operator提交一个标签选择器的功能时,因为当时修改的函数是私有的,无法添加单测函数,所以社区建议我补充一个 e2e test. 因为在当前的版本下,只 ...
- zabbix笔记_007 zabbix 分布式架构
1. zabbix 分布式架构[服务器数量较大的场景下使用] 现有架构: agent --> zabbix server proxy架构: agent --> zabbix proxy - ...
- 使用 OpenTelemetry 构建可观测性 05 - 传播和行李(Propagation & Baggage)
我们开发的应用程序可能具有不同的形态和架构:有些是单体应用,有些是微服务.为单体应用程序添加遥测数据相对来说简单,因为所有数据都在同一进程中.然而对于微服务应用程序,情况可能会更具挑战性. 通常,分布 ...
- MySQL条件判断IF,CASE,IFNULL语句详解
MySQL条件判断IF,CASE,IFNULL语句详解 1.IF语句的基本用法IF(condition, true_statement, false_statement);condition: 条件表 ...
- 高德解析城市的分析,根据高德的经纬度获取城市cityCode
高德解析城市的分析,根据高德的经纬度获取城市cityCode http://restapi.amap.com/v3/geocode/regeo?output=json&location=110 ...
- oppo、一加 android14 chrome116内核 input @click不触发
// 兼容Chrome内核116及以上版本中配置disabled的input组件无法触发并冒泡click事件 .uni-input-input:disabled { pointer-events: n ...
- Isolution
<template> <div style="float:left;width: 100%; margin-left: 0"> <el-row > ...