什么是Spring Framework
Spring 框架经历了从传统企业级开发到现代云原生、响应式编程的演变,每个大版本都在配置简化、性能提升、技术集成等方面持续创新。
随着Spring 生态系统庞大,适合各种规模和类型的Java应用开发框架也逐渐产生,而Spring Framework 都属于 Spring 生态的重要组成部分,它是一个功能强大且全面的 Java 企业级应用开发框架,通过提供 IoC(控制反转)和 AOP(面向切面编程)等核心特性,构建出松耦合、易于测试和维护的应用程序。
Spring Framework特性
Spring Framework 是一个功能全面的企业级应用框架,是构建复杂 Java 应用的基础设施。
核心特性
- 控制反转 (IoC) / 依赖注入 (DI):这是 Spring 的核心。它将对象的创建和依赖关系的管理权交给 Spring 容器,而不是在代码中手动创建,极大地降低了组件之间的耦合度。
- 面向切面编程 (AOP):允许将横切关注点(如日志、事务、安全)从业务逻辑中分离出来,使代码更加模块化和纯净。
- 生态系统:Spring 不仅仅是一个框架,它包含数据访问、事务管理、Web 开发(Spring MVC)、消息处理、测试等一系列解决方案。
- 集成能力:可以与几乎所有主流的第三方框架和技术(如MyBatis 等)无缝集成。
- 事务管理:通过简单的注解(如
@Transactional
)就可以轻松管理复杂的数据库事务。
适用场景
- 几乎概括所有类型的 Java 后端应用,特别是大型、复杂的企业级应用。
- 在需要高度可维护、可测试和可扩展的系统上更适用。
- 适用于集成多种技术和服务的项目。
使用介绍
- 配置组件需要手动配置应用程序的大部分组件,包括通过 XML 文件或 Java 配置类来定义 Bean、配置数据源、设置视图解析器等。
- 依赖管理 开发者需手动添加所需的依赖,并解决版本冲突等问题。
- 部署运行通常需要将应用打包成 WAR 文件,部署到外部的 Servlet 容器,如 Tomcat。
Spring Boot特性
Spring Boot 是在 Spring Framework 基础上构建的,它简化了 Spring Framework 的使用,让 Spring 的使用变得更加简单和快速,进而提高开发者的效率。
对于所有新项目,大部分人都强烈推荐使用 Spring Boot 来开始,因为它极大地简化了 Spring 应用的配置和开发过程,使得操作更加便捷。
核心特性
- 简化配置 :基于项目依赖自动配置 Spring 应用,是Spring Boot 最核心的特性。比如,添加
Spring-Boot-Starter-Web
依赖后,Spring Boot 会自动配置 Tomcat 和 Spring MVC。 - 依赖管理 :提供了一系列 Starter 依赖,快速集成特定功能(如数据库、Web、安全等),简化了 Maven/Gradle 的依赖管理。
- 内嵌服务器 :内置了 Tomcat等服务器,无需外部服务器即可运行应用,直接通过 main 方法启动即可。
- 生产就绪功能 :提供了开箱即用的生产特性,如应用程序指标收集、健康检查、外部配置等,方便应用的监控和管理。
适用场景
- 微服务架构。
- 快速开发 Java 应用。
- 需要快速搭建和部署的独立 Java 应用。
- 几乎所有新的 Spring 项目都推荐使用 Spring Boot。
特性区别
Spring Boot
与 Spring Framework
的区别如下:
特性 | Spring Framework | Spring Boot |
---|---|---|
配置方式 | 需要手动配置大量组件,可通过 XML 或 Java 配置类实现。 | 自动配置,基于依赖和约定进行合理配置,减少手动工作。 |
依赖管理 | 手动添加和管理依赖,需解决版本冲突。 | 使用 Starter 依赖简化管理,提供预设依赖组合。 |
服务器部署 | 无内嵌服务器,需部署到外部服务器。 | 内嵌 Tomcat等服务器,无需外部服务器。 |
开发效率 | 配置复杂,开发效率相对较低。 | 自动配置和快速启动,提高开发效率。 |
适用场景 | 适合大型、复杂、对配置有精细控制要求的应用,或需高度定制化的系统。 | 适合快速开发微服务、和原型应用,简化初始设置。 |
安全问题
Java代码通过编译后得到的jar包,通过反编译工具可以看到源码,Virbox Protector
工具分为java bce和vme方式,支持springFramework 4.0以上的版本,可以防止jar包被反编译。
具体参考Java bce最佳实践和Java vme最佳实践。
注意
如果引用的框架中使用到了自定义 ClassLoader时(比如struts2、jacoco、groovy等框架),java bce方式目前不支持自定义的ClassLoader,但Java vme方式无此限制。
什么是自定义ClassLoader
ClassLoader 是 Java 加载类(.class 文件)到 JVM 的机制,而自定义 ClassLoader 指的是开发者继承 java.lang.ClassLoader
或其子类,实现自己的类加载逻辑。
示例代码:
public class MyClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// 读取 class 文件
byte[] classData = ...;
return defineClass(name, classData, 0, classData.length);
}
}
Virbox Protector
工具的java bce方式,会将Application ClassLoader(应用类加载器)替换为自己的ClassLoader去调用,若开发者或使用的框架实现自己的类加载逻辑,就会导致jar包保护后我们的类加载器无法调用去解密处理,进而使得程序运行异常。
区分自定义ClassLoader
- 查看源码
- 一般查看是否有继承
ClassLoader
的类(如GroovyClassLoader
等)。 - 一般查看是否有
defineClass
、findClass
、loadClass
等方法的重写,比如at org.apache.catalina.loader.WebappClassLoaderBase.loadClass
- 运行时判断
一般通过 Class.getClassLoader()
获取类的加载器,判断是否为自定义实现,比如:
ClassLoader loader = MyClass.class.getClassLoader();
System.out.println(loader.getClass().getName());
- 常见自定义 ClassLoader框架
比如Groovy的自定义ClassLoader,如图所示:
