通过我的推荐,公司上个产品使用了淘宝的dubbo框架,应用效果还不错。 后端技术使用的是:springmvc+hibernatejap+dubbo。 最近参与一个新的产品,想使用jfinal做后端,同时集成dubbo框架, 网上没有现成的集成例子,自己动手丰衣足食,其中也遇到了一些坑,为了 避免有同样需求的人出错,这里做个记录。 dubbo文档http://alibaba.github.io/dubbo-doc-static/Home-zh.htm
注意事项:由于阿里关闭了dubbo.xsd的线上路径。需要将dubbo.xsd文件导入到eclipse本地。 window->preferences->xml->xml catalog->add->catalog entity->file system ->dubbo.xsd文件在dubbo-2.5.3.jar中(不限版本,解压到磁盘目录)-> key=http://code.alibabatech.com/schema/dubbo/dubbo.xsd PS:直接导入后,key默认没有后面的/dubbo.xsd 要手动加上,再在项目上右键validate即可消除xml校验错误
步骤
1. 准备jar文件,拷贝jfinal的spring支持jar文件到web-inf/lib目录下
2. 拷贝dubbo依赖到web-inf/lib目录下。一定要拷贝到lib目录下并在eclipse中右键buildpath -> add to buildpath 运行的时候,项目会验证dubbo.xsd文件。文件在dubbo.2.5.3.jar中。
3. applicationContext.xml、consumer.xml文件放到eclipse项目的src根目录下 applicationContext.xml内容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <import resource="consumer.xml"/> </beans>
consumer.xml内容,注意接口的包路径一定要和提供者的package一致。不然找不到。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="xjly3" /> <!-- 使用multicast广播注册中心暴露发现服务地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="com.supermap.egispservice.base.service.DemoService" version="2.5.3" check="false"/> </beans>
provider.xml内容,这个文件是放在提供者项目中的。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="provider_menu" /> <!--使用zookeeper注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <dubbo:protocol port="20821"/> <dubbo:service interface="com.supermap.egispservice.base.service.DemoService" version="2.5.3" ref="demoService" timeout="30000" retries="0" async="false" loadbalance="leastactive" actives="200"/> <bean id="demoService" class="com.supermap.egispservice.base.service.DemoServiceImpl" /> </beans>
4. JfinalConfig子类中添加springplugin
log.info("SpringPlugin spring"); me.add(new SpringPlugin("classpath:applicationContext.xml"));
5. controller调用代码
import java.util.List; import little.ant.platform.annotation.Controller; import little.ant.platform.controller.BaseController; import little.ant.platform.model.User; import little.ant.platform.tools.ToolContext; import little.ant.crm.model.Customer; import little.ant.crm.model.Messenger; import little.ant.crm.model.MessengerRemark; import little.ant.crm.service.MessengerService; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import com.jfinal.aop.Before; import com.jfinal.plugin.spring.Inject; import com.jfinal.plugin.spring.IocInterceptor; import com.supermap.egispservice.base.service.DemoService; @Before(IocInterceptor.class) @Controller(controllerKey = "/jf/crm/messenger") public class MessengerController extends BaseController { @SuppressWarnings("unused") private static Logger log = Logger.getLogger(MessengerController.class); @Inject.BY_NAME private DemoService demoService; /** * 默认列表 */ public void index() { log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); log.info(demoService.sayHello("jfinal!")); log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); render("/crm/messenger/list.html"); } }