在开发Java系统时,很难避免使用第三方类库,比如 缓存程序,Java Mail,等
自定义cache接口实现与缓存框架解耦
http://www.iteye.com/topic/697343
一文让我觉得这个理念应当可以应用于更加广泛的场合。
在上文中有人提到
“自定义接口的做法等同于创造标准,在没有规范标准的缓存框架中创造标准很难。”
将自定义接口称之为创造标准倒也不为过,不过这个标准是以当前系统的调用方式为导向的,使用范围也只是当前系统,并不是以兼容所有实现类为导向的,所以从一般标准的范围来看,自定义接口我认为算不上标准,自定义接口只是为了将自己的系统与实现类解耦,并不是为了兼容所有实现类而创建的标准。
因此,我觉得如果一个功能存在多种类型的实现类,这些实现类可能表现为不同的适用场景,例如缓存系统,此时最好应当将自己的系统与实现类解耦。
另外从易用的角度来看,如果实现类的API过于复杂,如SUN的Java Mail API,重新定义一套符合自己系统的API也有助于让调用部分的代码更清晰。
从可复用的角度来讲,通过自定义功能清晰的API,更有助于该API的复用。由于API与实现类分离,从而就可以根据系统需求来配置一个功能API的实现类,比如缓存系统,就可以根据实际需求在系统中的不同位置采用不同的缓存系统。这也正是IoC带来的优点。
然而在传统Java系统中,即便是使用了IoC,实现类的类名一样还是会出现在配置文件中,如果配置了若干实现类,那么在更换实现类时必须知道需要将哪几个实现类替换掉,从而增加了实现替换的复杂度。
借助JIOPi,可以让这一过程变得更加容易。
下面是一个自定义的邮件发送的API的调用示例
MyMailSender.sendMyMail("姓名<to@yourmail.com>", "hello", "content test");
借助JIOPi忽略实现类的特性,系统的lib目录只需一个MyMailAPI.jar,而无需部署javamail.jar,以及相关实现类的Jar包,让lib目录更易于管理
其中 MyMailSender 是 MailSender 接口的伪实现类,因为接口不能定义static方法,因此在伪实现类中增加static方法简化方法调用,借助JDK1.6的新特性,MyMailSender 的依赖注入不再依赖任何第三方API,当需要更换实现类时,只需要更改配置文件,而无需更改 MyMailSender 的代码
详细介绍请参阅:
http://jiopi.iteye.com/blog/693423
分享到:
相关推荐
【标题】"21-05-14_Nop4.4(005_自定义接口及其实现类依赖注入到内置依赖注入容器中,默认页被正常启动)" 涉及的是 nopCommerce 4.4 版本的一个具体开发实践,主要关注的是自定义接口的创建、其实现类的编写以及如何...
下面将对"android 自定义控件实现demo收集 及 框架收集"这一主题进行深入探讨。 首先,自定义控件在Android应用开发中扮演着重要角色。它们允许开发者根据项目需求创建具有独特功能和外观的组件,超越了Android SDK...
自定义观察者模式时,可以创建一个Subject接口或抽象类,包含添加、删除观察者的方法,如`addObserver(Observer observer)`、`removeObserver(Observer observer)`,以及通知所有观察者的方法,如`notifyObservers()...
在QT中,数据视图模型(TableModel)是用于展示数据的核心组件,它与控件如QTableView、QListView等进行交互,实现了数据和视图之间的解耦。本篇文章将深入探讨如何在QT中自定义TableModel以及如何使用SQLTableModel...
- `SpinerWindowDemo`可能包含了一个自定义的Spinner类,该类可能继承自Spinner,并在其内部实现了自定义的弹出窗口逻辑。 - 项目的布局文件可能包含了一个或多个Spinner实例,这些实例使用了自定义的Spinner类。 ...
观察者模式都能帮助实现对象之间的松耦合、依赖关系的解耦,并提供一种动态的消息通知机制
只需在配置类上添加`@EnableAsync`,并实现`AsyncConfigurer`接口,定义线程池大小和超时时间。 2. **@Async**:在需要异步执行的方法上添加`@Async`注解,SpringBoot会自动将这个方法放入配置的线程池中执行。这种...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对...
3. 注解策略:使用自定义注解(如`@MessageHandler`)标记这些实现类,以便在运行时能够根据注解信息找到合适的处理器。 4. 注解扫描与注册:在启动时,应用会扫描带有`@MessageHandler`注解的类,并将它们注册到一...
在实际开发中,推荐使用导出接口类或导出类指针的方式,它们能更好地实现模块间的解耦,提高代码的可维护性和可扩展性。对于需要传递对象实例的情况,可以考虑使用智能指针如`std::unique_ptr`或`std::shared_ptr`来...
- **环境搭建注意事项**:创建 Mybatis 工程时需遵循一定的命名规则,如映射文件名与 DAO 接口名相同,`namespace` 与接口全限定名匹配,`id` 与方法名匹配,以实现无须编写 DAO 实现类即可使用。 通过理解以上...
这种机制使得应用程序能够与多个第三方组件进行交互,而无需在编译时硬编码具体的实现类。SPI机制的核心是`java.util.ServiceLoader`类,它允许我们按照约定在`META-INF/services`目录下创建配置文件,来指定哪些类...
- **代码解耦**:视图的实现与Adapter分离,便于维护和扩展。 - **灵活的扩展性**:添加新的视图类型只需要新增策略类,无需修改已有代码。 - **性能优化**:可以通过复用不同类型的convertView,提高ListView滚动时...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。在实际项目开发中,有时我们可能需要对数据库中的某些字段使用自定义的...
2. 标签处理类(Tag Handler Class):这是实现自定义标签逻辑的Java类,它实现了`javax.servlet.jsp.tagext.Tag`接口或其子接口。 3. 标签文件(Tag File):可选的,用于简化标签定义,类似于HTML模板,可以包含...
### 自定义事件与参数(C#) 在C#编程中,事件是一种特殊的委托类型,用于封装方法调用,这些方法通常响应对象状态的变化或其他动作的发生。事件是.NET框架中的一个核心概念,它允许对象之间进行通信,而无需彼此...
自定义命令执行器就是一种实现业务解耦的方式,它提供了一个通用的接口,用于执行各种特定任务,而不是直接引用具体的业务类或方法。 2. **命令执行器**:命令执行器是一个设计模式,它的核心思想是将命令(即方法...
DAO是应用程序中的一个接口或抽象类,它提供了对数据存储的抽象,使得业务逻辑层可以不直接与数据库交互,而是通过DAO进行。这有助于解耦业务逻辑和数据访问逻辑,使得系统更加灵活,易于测试和维护。 自定义Dao时...
这些可以通过在自定义键盘类中添加相应逻辑来实现。 在`KeyDemo`的代码中,我们还能学习到如何测试和调试自定义键盘,例如设置断点,查看触摸事件的传递流程,以及验证输入数据的正确性。这对于理解Android事件分发...