前言:笔者今天初步尝试在eclipse中开发jar包文件,编译后作为组件提供别人调用,我把自己提供的jar包,称为provider,使用jar的工程称为receive。provider属于maven管理的一个jar工程,并且在provider中通过mybatis数据orm持久层和后台数据库进行了数据的交互操作。下面就结合自己开发中遇到的四个问题来一步步讲如何制作maven+mybatis的jar包组件。首先简单展现下自己的provider工程目录图。
关于如何建立maven工程,如何使用mybatis,怎么配置,请参考之前的文档,主要贴出来blue-spring-all.xml的代码
blue-spring-all.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<!-- spring 对xx包进行扫描 注解@controller翻译成控制器-->
<context:component-scan base-package="com.asiainfo.psm.*.*.service,com.asiainfo.psm.*.*.modal">
</context:component-scan>
<bean id="psmDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.74.15:1522:jttest"></property>
<property name="user" value="psm"></property>
<property name="password" value="psm"></property>
<property name="numHelperThreads" value="3"></property>
<property name="acquireIncrement" value="10"></property>
<property name="maxIdleTime" value="300"></property>
<property name="initialPoolSize" value="1"></property>
<property name="maxPoolSize" value="10"></property>
<property name="minPoolSize" value="5"></property>
<property name="maxStatements" value="0"></property>
<property name="maxStatementsPerConnection" value="100"></property>
</bean>
<!-- 配置事务管理器,注意这里的dataSource和SqlSessionFactoryBean的dataSource 基于tx的事务-->
<bean id="psmTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="psmDataSource" />
</bean>
<!-- 声明使用注解式事务 -->
<tx:annotation-driven transaction-manager="psmTransactionManager" />
<!-- 定义切点 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.psm.bmo.*.*(..))" />
</aop:config>
<!-- 定义增强 -->
<tx:advice id="txAdvice" transaction-manager="psmTransactionManager">
<tx:attributes>
<!-- <tx:method name="save*" propagation="REQUIRED" read-only="false" />
<tx:method name="update*" propagation="REQUIRED" read-only="false"/>
<tx:method name="delete*" propagation="REQUIRED" read-only="false"/>
<tx:method name="query*" propagation="SUPPORTS" read-only="true"/> -->
<!-- 支持当前事务,若无则以无事务方式执行 -->
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 全局异常页面,该页面显示异常的详细信息,在controller中捕获后由detailedHandlerExceptionResolver统一处理-->
<bean id="detailedHandlerExceptionResolver" class="com.asiainfo.psm.common.exception.DetailedHandlerExceptionResolver" >
</bean>
<!-- enable autowire -->
<context:annotation-config />
<!-- enable transaction demarcation with annotations -->
<tx:annotation-driven />
<!-- mybatis sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="psmDataSource"/>
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:sqlMap/sqlMap_*.xml" />
</bean>
<!-- Mapper自动处理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.asiainfo.psm.*.*.mapper" />
</bean>
<!-- sessionTemplate -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype">
<constructor-arg index="0" name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 操作鉴权控制BMO层 sww-->
<bean id="iOperateManagerBMO" class="com.asiainfo.psm.authentication.operate.bmo.OperateManagerBMOImpl">
</bean>
</beans>
这里是provider运行所有需要实例化的Bean,我们在这里定义好,之后在receiver中只要<import resource="blue-spring-all.xml"/>,这样子就把这些Bean加载到了receiver的spring 容器中了,类似于provider所在上级的war工程中org.springframework.web.servlet.DispatcherServlet---spring容器或者contextLoaderListener---web容器的作用。
一:provider工程打jar包:
打包方法一,也是最基本的:
Export--->Jar File --->
网上教程很多,这也是最基本打包方式,个人感觉不太好用,有时候编译的class文件会莫名其妙少了一些。
打包方法二:基于maven工程的
这个使用起来更好些,但是要求provider是基于maven工程建立的。
二:provider工程依赖的jar包怎么提供给receiver
笔者开始有尝试过使用maven插件 maven-assembly-plugin -maven打包插件,可以对provider依赖的jar进行统一打包,也有很多文章介绍插件用法,其实我觉得没必要,笔者在这里饶了好大圈子,多亏公司技术大牛提示使用maven的deploy直接把自己的provider发不到私服上,私服会自动把provider依赖的jar 以pom的写入dependency。如何使用deploy请参考文章:http://blog.csdn.net/jun55xiu/article/details/39671907
三:receiver中使用provider
首先receiver的pom.xml中引入
然后有两个地方要注意
3.1.provider 中Bean命名要注意特殊
provider中数据源Bean的名字要注意区分,否则如果都是dataSource,provider加载数据源会使用receiver的数据源去了。
3.2.receiver中要引入provider的配置文件
相当于receiver的spring容器去管理provider的bean实例。
ea基本上就这些注意了。这样子你就可以提供服务编译成class给别人使用了,可以和redis交互可以和数据库交互。以上当作备忘录。
其中关于如何自动引入provider的xml到receiver,大神们有什么好的方法么,减少import引入。