从工厂模式回看解决双亲委派问题

本文介绍了JVM如何通过上下文加载器解决双亲委派模式下核心类加载非核心类的问题。上下文加载器允许核心类通过创建新的ClassLoader实例来加载应用类,从而避免双亲委派的限制。此外,文章还探讨了JDK 9中双亲委派模型的变化,平台类加载器可以直接访问应用类加载器加载的类,打破了原有的单向访问限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

上下文加载器

突破双亲委派模式

JDK 9双亲委派模型


      简单工厂模式下,假设核心类和工厂方法由启动类加载器加载,应用类由应用类加载器加载,因为双亲委派模式下上层的类加载器无法访问下层ClassLoader加载的类,所以会导致启动类加载器加载的工厂方法无法创建应用类加载器加载的类的实例。在工厂模式中解决的方式就是把工厂方法抽象出来,具体生成实例的逻辑交由子类来实现,简单工厂模式变成抽象工厂模式,这个在上一篇日志中总结到,那么回到双亲委派问题,JVM解决的方式是在启动类加载器代码中新建一个ClassLoader来完成对下层应用类加载器加载的类的实例化,具体来看看它是怎么做的。

 

上下文加载器

      回到JVM里,工厂模式对应的就是核心类提供个外部类的接口,SPI(Service Provider Interface),这个接口就是外部类需要自己实现业务逻辑的接口,拿DocumentBuilderFactory类举例,该类是一个抽象类,可以实现对XML文件的解析,由启动类加载器加载,所以是一个核心类,类中有一个newInstance方法,负责创建并返回一个DocumentBuilderFactory实例,具体实现在FactoryFind.find()方法中:

public static DocumentBuilderFactory newInstance() {
	try {
		return
### 关于依赖注入与双亲委派的概念及其在Java Spring框架中的应用 #### 依赖注入的定义及实现机制 依赖注入是一种设计模式,用于实现控制反转(IoC),其核心理念是在运行期间动态地向对象提供其所依赖的对象。通过这种方式可以降低组件间的耦合度并提高灵活性。 在Spring框架里,依赖注入主要通过构造器注入、设值方法注入或接口注入来完成。其中最常用的是前两种形式: - **构造器注入**:当一个类拥有多个必需属性时推荐使用此方式。它能确保这些属性不会为空,并且有助于不可变对象的设计。 - **设值方法注入**:适用于可选参数的情况。允许设置默认值,在某些场景下更加灵活方便。 具体来说,`BeanFactory` 和 `ApplicationContext` 是两个重要的抽象工厂接口,负责管理beans生命周期以及配置信息。开发者只需声明好bean之间的关系即可让容器自动处理其余工作[^2]。 ```java // 构造函数注入示例 public class Service { private final Repository repository; @Autowired // 或者省略@Autowired 注解 public Service(Repository repository) { this.repository = repository; } } ``` #### 双亲委派模型的理解 所谓“双亲委派”,实际上是指JVM中ClassLoader加载Class文件的一种层次结构。每当应用程序请求加载某个特定名称的class时,该过程会先委托给父级Loader尝试解析;只有当上级无法满足需求时才会由自己继续查找资源路径下的对应字节码文件进行编译加载操作[^1]。 这种架构有效防止了不同版本间可能存在的冲突问题,同时也简化了安全管理逻辑——即越基础级别的库应当尽可能早些初始化完毕以便后续调用[^3]。 #### 在Spring框架内的体现 对于Spring而言,虽然本身并不直接参与ClassLoading环节,但是却巧妙利用了这套体系实现了模块化的服务治理方案。例如,在启动阶段会优先读取全局共享的基础包(`org.springframework`)内预置的各种工具类和服务接口定义;而对于业务层面上的具体实现则交给了各自独立部署的应用程序上下文中自行决定。 此外,考虑到实际开发过程中可能会遇到跨项目协作的需求,因此还提供了诸如OSGi这样的高级特性支持,使得各个子系统之间既能够保持相对隔离又不失必要的交互能力[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值