📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

IoC容器核心依赖注入实现模式
1. 构造器注入
构造器注入确保了对象在实例化过程中立即获得所有的依赖项,这在某些情况下可以防止依赖项为null。在Spring中,可以通过在类定义中提供依赖项类型的构造器来实现。例如,如果有一个UserService
类,它需要一个UserRepository
来获取用户数据,可以通过以下方式构造:
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 业务方法
}
在这里,UserRepository
的实例被传递给UserService
的构造器,Spring容器在创建UserService
时会自动注入UserRepository
。
2. Setter注入
setter注入通过提供setter方法来设置属性值,是Java Bean规范的一部分。这种方式在对象创建之后,可以随时更改依赖项。在Spring中,可以通过定义一个setter方法来实现依赖注入:
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 业务方法
}
Spring容器会自动调用setter方法并注入相应的依赖项。
3. 字段注入
字段注入是最简单的注入方式,直接在类的字段中声明依赖项。Spring容器会在初始化Bean时自动注入字段值:
public class UserService {
@Autowired
private UserRepository userRepository;
// 业务方法
}
使用@Autowired
注解,Spring容器会自动注入UserRepository
。
4. 方法注入
方法注入是在对象的方法中注入依赖项,这种方法不如构造器注入和setter注入常见,但它可以用于注入一些复杂的依赖项或延迟注入。在Spring中,可以使用@Inject
注解或实现javax.inject.Injectable
接口来注入方法参数:
public class UserService {
private UserRepository userRepository;
@Inject
public void init(UserRepository userRepository) {
this.userRepository = userRepository;
}
// 业务方法
}
Spring容器会自动调用init
方法并注入UserRepository
。
5. 组件扫描机制
组件扫描允许Spring容器自动检测并注册具有特定注解的类。例如,可以使用@Component
注解标记一个类为组件,Spring容器会自动检测并注册这个类:
@Component
public class UserRepositoryImpl implements UserRepository {
// 实现细节
}
这样,Spring容器就会自动将UserRepositoryImpl
注册为Bean。
6. Bean作用域
Bean作用域定义了Spring容器中Bean的实例化和生命周期管理。Spring提供了多种作用域,如单例(Singleton)和原型(Prototype)。单例作用域是默认的,表示一个类只有一个实例,而原型作用域表示每次请求都会创建一个新的实例。
7. 条件化配置(@Conditional)
条件化配置允许根据特定的条件创建Bean。例如,可以使用@ConditionalOnProperty
注解来创建一个仅在特定属性值存在时才创建的Bean:
@Component
@ConditionalOnProperty(name = "app.env", havingValue = "production")
public class ProductionBean {
// 特定于生产环境的Bean
}
AOP技术体系
1. 代理模式实现
AOP通过代理模式实现,代理可以是JDK动态代理或CGLIB代理。JDK动态代理仅适用于实现了至少一个接口的类,而CGLIB代理适用于没有实现接口的类。
2. JDK动态代理
JDK动态代理通过实现java.lang.reflect.Proxy
类来创建代理。代理对象将拦截目标对象的方法调用,并可以在这些调用前后执行额外的逻辑。
3. CGLIB代理
CGLIB代理通过生成目标类的子类来实现,子类将重写目标类的方法以执行额外的逻辑。CGLIB提供了更高的灵活性,因为可以拦截所有的方法调用。
4. 切点表达式语法
切点表达式定义了AOP中的切点,Spring提供了丰富的语法来定义切点,例如:
execution(* com.example.service.*.*(..))
这个表达式匹配com.example.service
包下所有以service
结尾的方法。
5. 通知类型
通知类型定义了AOP中的执行逻辑,如前置通知、后置通知等。Spring提供了多种通知类型,可以针对不同的场景选择合适的类型。
6. AOP应用场景
AOP广泛应用于日志记录、性能监控、事务管理等场景。例如,在日志管理中,可以使用AOP记录所有方法调用的日志。
数据持久化
1. JDBC模板
JDBC模板通过简化JDBC操作来减少代码量。例如,可以使用JdbcTemplate
类执行SQL查询并自动处理异常。
2. 事务管理
事务管理确保数据的一致性。在Spring中,可以通过声明式事务或编程式事务来实现。声明式事务使用@Transactional
注解,编程式事务使用TransactionTemplate
。
3. 声明式事务编程
使用@Transactional
注解可以简化事务管理。例如:
@Transactional
public void updateData() {
// 业务逻辑
}
如果业务逻辑成功执行,事务将自动提交;如果抛出异常,事务将回滚。
4. 编程式事务
编程式事务需要编写更多的代码来管理事务。例如,使用TransactionTemplate
:
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(status -> {
// 业务逻辑
return null;
});
5. ORM集成
ORM框架如Hibernate和JPA提供了一种将对象映射到数据库表的方法。Spring框架集成了这些ORM框架,允许使用这些框架进行数据持久化。
6. 会话管理
会话管理涉及管理数据库连接和事务。Spring提供了SessionFactory
和EntityManagerFactory
来管理会话。
7. JPA规范实现
JPA规范定义了对象关系映射的接口和约定。Spring Data JPA是一个基于JPA规范的数据访问框架,提供了许多内置的repository实现。
8. 多数据源配置
多数据源配置允许应用程序连接到多个数据库。Spring使用AbstractRoutingDataSource
来路由请求到正确的数据源。
Web开发体系
1. MVC架构
MVC架构将Web应用程序分为模型、视图和控制器。Spring MVC遵循这种架构,提供了控制器、视图解析器和模型等组件。
2. 控制器
控制器处理用户请求并返回响应。Spring使用@Controller
注解来标识控制器类。
3. 视图解析
视图解析器将控制器返回的模型数据传递给视图。Spring支持多种视图解析技术,如JSP、Thymeleaf等。
4. 数据绑定
数据绑定将用户输入的数据绑定到Java对象。Spring提供了强大的数据绑定功能,支持自定义类型转换器。
5. RESTful支持
RESTful支持允许开发者创建遵循RESTful原则的API。Spring使用@RestController
和@RequestMapping
等注解来实现RESTful API。
6. 异常处理机制
异常处理机制允许开发者捕获和处理Web应用程序中的异常。Spring使用@ExceptionHandler
注解来定义异常处理方法。
7. 文件上传下载
Spring框架提供了MultipartFile
接口和FileUpload
类来处理文件上传和下载。
安全框架
1. 认证流程
认证流程验证用户身份。Spring框架支持多种认证方式,如基于表单、基于令牌等。
2. 授权模型
授权模型限制用户访问资源。Spring框架支持基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)。
3. CSRF防护
CSRF防护防止跨站请求伪造攻击。Spring框架提供了CSRF防护机制。
4. OAuth2集成
OAuth2允许第三方应用访问用户资源。Spring框架提供了OAuth2认证服务器和客户端支持。
5. 方法级安全
方法级安全根据方法上的注解控制用户访问资源。Spring框架提供了@PreAuthorize
和@PostAuthorize
等注解。
高级特性
1. 事件发布/监听机制
事件发布/监听机制允许将事件发布给监听器。Spring提供了ApplicationEvent
类和ApplicationListener
接口。
2. SpEL表达式
SpEL表达式在运行时计算值。Spring框架支持SpEL表达式,用于动态配置和数据绑定。
3. 响应式编程(WebFlux)
响应式编程处理异步、非阻塞事件。Spring框架提供了WebFlux框架,支持响应式编程。
4. 测试框架集成
Spring框架集成了JUnit、Mockito等测试框架,方便进行单元测试和集成测试。
5. 缓存抽象
缓存抽象将缓存操作封装起来,支持多种缓存实现,如EhCache、Redis等。
Spring Boot生态
1. 自动配置原理
Spring Boot通过分析项目依赖来自动配置Spring框架和第三方库。
2. Starter机制
Starter将常用的依赖打包成一个模块,方便开发者使用。
3. Actuator监控
Actuator提供应用程序的运行状态、配置信息、日志等监控功能。
4. 配置文件体系
Spring Boot提供多种配置文件,如application.properties
和application.yml
,用于配置应用程序属性和配置信息。
📥博主的人生感悟和目标

- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~