`
jiopi
  • 浏览: 32307 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

无API侵入的JIOPi模块化编程风格达成

阅读更多

无API侵入的JIOPi模块化编程风格达成

——POJO风格实现简单邮件发送API调用

 

API侵入是任何框架都很难避免的问题,而被侵入框架API的程序也很容易被该框架绑定,很难脱离框架运行环境。JIOPi作为一种IOP编程和模块化编程风格(而非框架),一直努力减少额外API的引入,非运行时标注让JIOPi模块完全与POJO兼容,通过IoC框架整合,避免调用代码中再引入额外API。然而IoC框架整合也只是将JIOPiAPI从用户的代码中转移到了IoC框架配置文件中,并且需要引入IoC框架。JIOPi 0.4引入了全新的类重定义代码风格,完全避免了使用JIOPi模块而需要引入JIOPi API的问题,真正将JIOPi从框架变为编程风格,将编程风格的实现变为透明实现,你要做的,只是将一个不到50k的Jar包放在lib目录中,然后在应用程序启动后尽早调用JIOPi的初始化程序函数。

 

 注:JDK1.5无法实现上下文环境(ContextClassLoader)中的类重定义,这个特性需要JDK1.6的支持。

 

下面就以调用一个简单邮件发送API为例来说明JIOPi v0.4带来的无API侵入风格的模块化编程。相关源码请下载JIOPi-iBean-0.4.0.0-src.zip源码包

http://code.google.com/p/ibean/downloads/list

 

邮件发送API定义如下:

MailSender.java

package org.jiopi.blueprint.mailsender;

import org.jiopi.framework.annotation.blueprint.RegisterControlPanel;

@Version
@RegisterControlPanel("jiopi.MailSender")
public interface MailSender {

	@RegisterControlPanel("sendMail")
	public String sendMail(String to,String subject,String message) throws SendMailException;

	public String sendMail(String to,String subject,String html,String text) throws SendMailException;
	
	@RegisterControlPanel("createNewTextMail")
	public Mail createNewTextMail();
	
	@RegisterControlPanel("createNewHtmlMail")
	public Mail createNewHtmlMail();
	
	public String getHostName();
	
	public String getAuthenticationUserName();
	
	public String getAuthenticationPassword();
	
	public String getFrom();
	
	public String getCharset();
}

 

Mail.java

package org.jiopi.blueprint.mailsender;

import java.io.File;
import java.net.URL;

import org.jiopi.framework.annotation.blueprint.RegisterControlPanel;

@Version
@RegisterControlPanel("jiopi.Mail")
public interface Mail {
	
	public final int TEXT_MAIL = 1;
	public final int HTML_MAIL = 2;
	
	public void addTo(String to);
	
	public void addTo(String email,String name);
	
	public void setFrom(String from);
	
	public void setFrom(String email,String name);
	
	public void setSubject(String subject);
	
	public void setTextMsg(String text);
	
	public void setHtmlMsg(String html);
	
	public void changeMailType(int mailType);
	
	public String embed(URL url);
	
	public String embed(File file);
	
	public void attach(MailAttachment attachment);
	
	public String send() throws SendMailException;
	
}

 

MailAttachment.java

package org.jiopi.blueprint.mailsender;

import java.io.File;
import java.net.URL;

@Version
public final class MailAttachment implements java.io.Serializable{
	
	private static final long serialVersionUID = 3366988524797658258L;
	
	public final File file;
	public final URL url;
	
	private String name;
	private String description;
	
	public MailAttachment(File file){
		this.file =  file;
		this.url = null;
	}
	
	public MailAttachment(URL url){
		this.url = url;
		this.file = null;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
	
	
}

 

以上是主要的三个类,还有一个Version.java定义版本信息,SendMailException.java定义了一个异常

 

如果只想发送简单邮件,可直接调用MailSender的sendMail方法,如果想发送带附件的邮件,则需要使用Mail对象,Mail对象可以从MailSender中生成,而在JIOPi v0.4中,则也可以直接new出来。并且可以将本不是静态方法的sendMail方法转换为静态方法,实现如下代码的简单调用:

MyMailSender.sendMyMail("姓名<to@yourmail.com>", "hello", "content test");

 

下面我们就来一步一步实现基于JIOPi模块化编程的简单邮件发送API的调用。
首先需要知道 jiopi.module.mailsender 模块实现了该邮件发送蓝图。这是一个基于Apache Commons Email和JavaMail的实现,因此邮件发送不是异步的,如果你希望实现异步发送,则可以重新做一个模块来实现,而对于使用代码来说,只需要修改一下模块名即可。
为了不引入额外API,则需要生成自己的实现类,无需填写任何实现代码,因为会被重定义,代码如下:

 

MyMailSender.java

package org.jiopi.ibean.show.mailsender;

import org.jiopi.blueprint.mailsender.Mail;
import org.jiopi.blueprint.mailsender.MailSender;
import org.jiopi.blueprint.mailsender.SendMailException;

public class MyMailSender implements MailSender {
	
	private static MailSender instance = new MyMailSender();

	public Mail createNewHtmlMail() {
		// TODO Auto-generated method stub
		return null;
	}

	public Mail createNewTextMail() {
		// TODO Auto-generated method stub
		return null;
	}

	public String getAuthenticationPassword() {
		// TODO Auto-generated method stub
		return null;
	}

	public String getAuthenticationUserName() {
		// TODO Auto-generated method stub
		return null;
	}

	public String getCharset() {
		// TODO Auto-generated method stub
		return null;
	}

	public String getFrom() {
		// TODO Auto-generated method stub
		return null;
	}

	public String getHostName() {
		// TODO Auto-generated method stub
		return null;
	}

	public String sendMail(String arg0, String arg1, String arg2)
			throws SendMailException {
		// TODO Auto-generated method stub
		return null;
	}

	public String sendMail(String arg0, String arg1, String arg2, String arg3)
			throws SendMailException {
		// TODO Auto-generated method stub
		return null;
	}
	
	public static Mail createMyNewHtmlMail() {
		return instance.createNewHtmlMail();
	}
	
	public static Mail createMyNewTextMail() {
		return instance.createNewTextMail();
	}
	
	public static String sendMyMail(String arg0, String arg1, String arg2)
			throws SendMailException {
		return instance.sendMail(arg0, arg1, arg2);
	}

	public static String sendMyMail(String arg0, String arg1, String arg2,
			String arg3) throws SendMailException {
		return instance.sendMail(arg0, arg1, arg2, arg3);
	}

}

 

MyMail.java

package org.jiopi.ibean.show.mailsender;

import java.io.File;
import java.net.URL;

import org.jiopi.blueprint.mailsender.Mail;
import org.jiopi.blueprint.mailsender.MailAttachment;
import org.jiopi.blueprint.mailsender.SendMailException;

public class MyMail implements Mail {

	public void addTo(String arg0) {
		// TODO Auto-generated method stub

	}

	public void addTo(String arg0, String arg1) {
		// TODO Auto-generated method stub

	}

	public void attach(MailAttachment arg0) {
		// TODO Auto-generated method stub

	}

	public void changeMailType(int arg0) {
		// TODO Auto-generated method stub

	}

	public String embed(URL arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public String embed(File arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public String send() throws SendMailException {
		// TODO Auto-generated method stub
		return null;
	}

	public void setFrom(String arg0) {
		// TODO Auto-generated method stub

	}

	public void setFrom(String arg0, String arg1) {
		// TODO Auto-generated method stub

	}

	public void setHtmlMsg(String arg0) {
		// TODO Auto-generated method stub

	}

	public void setSubject(String arg0) {
		// TODO Auto-generated method stub

	}

	public void setTextMsg(String arg0) {
		// TODO Auto-generated method stub

	}

}

 

 

其中MyMailSender中,又额外添加了几个静态方法,这是为了可以更加方便调用。

 

下面需要配置 jiopi.module.mailsender 模块,配置发送邮件所需的设置,以及类重定义设置:
jiopi-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://www.jiopi.org/2010/JIOPISchema" xmlns:jiopi="http://www.jiopi.org/2010/JIOPISchema-configuration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jiopi.org/2010/JIOPISchema configuration/jiopi-config-configuration.xsd ">
    <module name="jiopi.module.mailsender" version="0.1">
        <controlpanel name="jiopi.MailSender" id="mymail">
            <properties>
                <property name="hostname"><value>smtp.yourmail.com</value></property>
                <property name="username"><value>yourname@yourmail.com</value></property>
                <property name="password"><value>yourpassword</value></property>
                <property name="charset"><value>UTF-8</value></property>
                <property name="from"><value>姓名 &lt;yourname@yourmail.com&gt;</value></property>
            </properties>
        </controlpanel>
        <controlpanel name="jiopi.Mail" id="mymail">
            <inner-accessory id="mailSender" module="this" configuration="mymail"/>
        </controlpanel>
    </module>

    
    <redefine class="org.jiopi.ibean.show.mailsender.MyMailSender" module="jiopi.module.mailsender" version="0.1" controlpanel="jiopi.MailSender" configuration="mymail"/>
    <redefine class="org.jiopi.ibean.show.mailsender.MyMail" module="jiopi.module.mailsender" version="0.1" controlpanel="jiopi.Mail" configuration="mymail"/>
    
</configuration>

 

控制面板配置中,使用了指定配置ID,通过配置不同的ID,你可以创建多个实现类,以使用不同的邮件配置。

redefine标签则定义了将用哪个模块的哪个控制面板来重定义指定类,从而避免使用额外的API来获取实现模块,通过类重定义,你可以直接new出来而不是通过额外的API来get。
完成这些配置,便可以这样调用了:

 

MyMailSender.sendMyMail("姓名<to@yourmail.com>", "hello", "content test");
Mail myMail = new MyMail();
		myMail.addTo("to@yourname.com","姓名");
		myMail.setSubject("测试邮件");
		myMail.setTextMsg("测试内容");
		
		MailAttachment attachment = new MailAttachment(new URL("http://www.google.com.hk/intl/zh-CN/images/logo_cn.png"));

		myMail.attach(attachment);
		myMail.send();

 

当然,你需要先调用一下JIOPi的初始化函数

FrameworkInitializer.initialize();

 

纯POJO+非运行时Annotation(蓝图和模块中)+XML装配文件=Java模块化系统

 

这便是JIOPi v0.4带来的Java模块化编程风格。

 

分享到:
评论

相关推荐

    swift-主流转场动画无侵入API简单易用。

    "yuwind-HHTransition-341f482"这个压缩包文件可能包含了名为HHTransition的一个Swift库,它专注于提供主流的、无侵入性的转场动画解决方案,其API设计简洁易用,方便开发者快速集成到自己的项目中。 首先,我们来...

    中天开关电源模块化升级空开软件

    《中天开关电源模块化升级空开软件详解》 中天开关电源模块化升级空开软件是一款专为中天品牌开关电源系统设计的智能化管理工具。该软件的主要目标是提升开关电源系统的性能、稳定性和效率,同时简化了维护与升级...

    一个非侵入的api编译、收集、Rest文档生成工具

    标题中的“一个非侵入的api编译、收集、Rest文档生成工具”指的是一个软件工具,它能够不改变原有代码结构或逻辑的情况下,对API进行处理。非侵入性意味着这个工具不会对开发者的工作流产生干扰,而是通过某种机制在...

    Android-AOP实现无侵入提高开发效率工具

    总的来说,AOP在Android开发中的应用,特别是无侵入式的工具,为我们提供了更加高效、模块化的解决方案。通过理解和掌握AOP,开发者能够更好地优化代码结构,减少冗余,提升项目的整体质量和开发效率。

    Boost.org侵入式模块.zip

    侵入式(Intrusive)是Boost库中的一个模块,它提供了一种高效且灵活的方式来管理内存,特别是对于那些需要直接控制内存布局和对象生命周期的应用。侵入式容器允许程序员将容器功能直接“侵入”到用户定义的数据结构...

    Java非侵入式API接口文档工具apigcc用法详解

    Java非侵入式API接口文档工具apigcc是一款旨在简化开发者文档编写负担的工具,它通过分析代码和注释自动生成RESTful API文档,实现了"代码即文档"的理念。apigcc工具允许开发者专注于编写高质量的代码,同时不必担心...

    2-3、使用探针技术实现无侵入式的监控和链路追踪-韩天峰@学而思.pdf

    探针技术是一种无侵入式的监控方法,通过在软件运行时动态插入监控代码,可以实时监控系统状态而不需要重启服务或修改应用程序代码。这种方法的优点是减少对应用程序性能的影响,并且可以快速应用在任何已部署的应用...

    GPU上的非侵入式风格化渲染.pdf

    在现代计算机图形学中,GPU上的非侵入式风格化渲染技术正成为一个重要研究和发展方向。这种技术的核心理念在于利用GPU的硬件加速特性,通过特定算法在不改变原有图形渲染流程的基础上,实现对渲染结果的实时后处理,...

    Prism系列之模块化

    - 提供的`PrismMetroSample-master`可能是Prism模块化的一个实际演示项目,它展示了如何在基于Metro风格(即Windows Presentation Foundation,WPF)的应用中使用Prism模块化。 - 这个示例可能包含多个模块,每个...

    builddoc.rar_无任何侵入,一键自动生成接口文档,前后端分离开发者的福音

    `builddoc.rar` 提供了一个解决方案,即无任何侵入的一键自动生成接口文档工具,这对于前后端分离的开发者来说无疑是一大福音。 首先,让我们理解"无任何侵入"的含义。在开发过程中,侵入性通常指的是对现有代码或...

    kernelcss非侵入性语义化css和JavaScript框架

    kernel.css 是一个非侵入性的语义化CSS和JavaScript框架,旨在提高网页开发的效率和可维护性。这个框架的核心理念是将样式和行为分离,同时保持代码的清晰和易于理解,这对于大型项目的开发尤其重要。 在CSS方面,...

    模块化的JavaScript库:Tangram.pdf

    FE库在百度社区类产品线得到较广泛的使用,从那时起逐渐形成了模块化、无侵入的设计思想。 设计原理 Tangram的设计原理是模块化的,核心思想是将JavaScript库拆分成小模块,每一个函数方法是一个独立的模块,在UI...

    C++ HookAPI开发包

    HookAPI是一种编程技术,它通过在特定位置插入代码(通常称为"钩子")来监控或修改其他代码的执行流程。在Windows操作系统中,HookAPI通常涉及到Windows API函数的拦截,这使得开发者能够在目标函数被调用前后执行...

    swift-一个无侵入的iOScrash防护框架

    无侵入性意味着该框架在不改变或最小化修改原项目代码的情况下,可以集成到你的应用中。它通过全局异常处理、内存管理优化等技术,在不影响原有业务逻辑的前提下,提供异常捕获和处理能力。 2. **异常处理机制**:...

    无侵入修改列表方案1

    【无侵入修改列表方案1】的描述涉及...综上所述,这个无侵入修改列表方案利用了数据库、API代理和前端缓存等技术手段,实现了对商机管理列表的自定义列配置,提升了用户体验,同时也保证了原有系统的稳定性和可维护性。

    张忻正丨B站-iOS工程模块化实践与优化

    标题“张忻正丨B站-iOS工程模块化实践与优化”中提到的关键词包括B站、iOS、工程模块化实践、优化。B站即哔哩哔哩,是中国知名的视频分享网站,拥有庞大的用户群体和丰富的内容生态,其中包括大量iOS应用的开发者...

    自研应用框架,开箱即用,零侵入性接入,遵循_Spring_官方的模块化管理,

    自研应用框架,开箱即用,零侵入性接入,遵循_Spring_官方的模块化管理,保证业务依赖可选项。_eden-architect

    电子功用-填充凝胶的模块化电气接插件

    《电子功用-填充凝胶的模块化电气接插件》 在现代电子设备中,电气接插件扮演着至关重要的角色。它们不仅负责连接不同电路板或设备,还确保信号和电源的稳定传输。本资料重点探讨了一种创新技术——填充凝胶的模块...

    基于Java标准doc注释构建的代码零侵入的HTTP RESTful API在线测试,文档阅览以及SDK导出框架,支.zip

    总结来说,这个项目提供了一个基于Java doc注释的解决方案,实现了RESTful API的无侵入式测试、文档生成和SDK导出,对于任何涉及到RESTful API开发的团队来说,都是一个极具价值的工具。它体现了代码文档化、自动化...

Global site tag (gtag.js) - Google Analytics