Evar框架使用手册

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

东创科技
Evar框架使用手册
V1.0
杭州东创科技有限公司
杭州东创科技有限公司,东创宽带接入差异化平台《BOD_API_宽带接入差异化系统平台S&MTP接口设计说明书》已经达成,并由所有相关负责人确认如下:
文件准备: 李振东日期:2009-6-15
文件审核: 日期:
文件批准: 日期:
文件批准: 日期:
更新情况
目录
1引言 (5)
1.1文档说明 (5)
1.2格式约定 (5)
1.3参考资料 (5)
1.4约定与假设 (5)
1.5术语解释 (5)
2接口在网络中的位置.................................. 错误!未定义书签。

3公共数据定义........................................ 错误!未定义书签。

3.1.1MediaInfo消息结构 ................................................. 错误!未定义书签。

3.1.2ArrayOfMediaInfo ................................................... 错误!未定义书签。

4S&MTP消息定义....................................... 错误!未定义书签。

4.1MC消息............................................................................ 错误!未定义书签。

4.2SVR_REQ消息................................................................. 错误!未定义书签。

4.2.1用户认证请求接口(UserAuth) ................................ 错误!未定义书签。

4.2.2用户业务激活接口(ServieActivation) ............... 错误!未定义书签。

4.2.3用户业务取消激活接口(ServieDeactivation) ........ 错误!未定义书签。

4.2.4用户下线通知接口(UserTerminate) ....................... 错误!未定义书签。

4.3RACS_REQ消息.............................................................. 错误!未定义书签。

4.3.1用户信息认证查询请求接口(Authentication) ....... 错误!未定义书签。

4.3.2用户策略下发接口(PolicyEnforcement) ................ 错误!未定义书签。

4.4RACS_ACK消息............................................................. 错误!未定义书签。

4.4.1用户AAA信息查询结果响应接口(AuthenticationAck)错误!未定义书
签。

4.4.2用户策略下发结果响应接口(PolicyEnforcementAck) . 错误!未定义书
签。

4.4.3用户上线通知接口(Userlogin) ................................. 错误!未定义书签。

4.4.4用户下线通知接口(UserLogout) ............................. 错误!未定义书签。

5非功能需求.......................................... 错误!未定义书签。

5.1标题二................................................................................ 错误!未定义书签。

5.1.1标题三 (28)
1引言
1.1 文档说明
1.2 格式约定
正文文本:采用“小四”号宋体,首行缩进两个字符,行间距离为1.5倍行距。

标题、Block Label:采用黑体
屏幕输出:“Terminal Display”格式表示屏幕输出信息。

此外,屏幕输出信息中夹杂的用户从终端输入的信息采用加粗字体表示。

1.3 参考资料
本文档中所引用的参考文献及其版本如下
1.4 约定与假设
文档中涉及到参考界面,仅作为参考使用,用于展示参数的作为,设计开发中,界面元素不需要与参考界面相同。

对于描述数据类型时,如果是字符串类型,没有特别说明的情况下,都是允许出现特殊字符的。

1.5 术语解释
2类管理框架
2.1 框架原理
基于开源框架Spring。

2.2 配置文件编写和存放路径
2.2.1主配置文件
文件名称:evarvno.xml;
存放路径:默认在classes目录下;
设置日志配置文件路径:配置大项为ConfigureFile,配置小项为LoggerConf,不指定路径时,优先从classes目录下查找;
设置MessageSource文件路径:配置大项为ConfigureFile,配置小项为MessageSourceConf,不指定路径时,优先从classes目录下查找;
设置类容器配置文件路径:配置大项为ConfigureFile,配置小项为BeanContainerConf,多个文件之间用英文逗号分隔,一般需要包含
spring-bean-container-datasource.xml,spring-bean-container-cache.xml,spring-bean-container.xml这3个文件,不指定路径时,优先从classes目录下查找;
例子:
<?xml version="1.0" encoding="gb2312"?>
<evar-app>
<sys-cfg></sys-cfg>
<app-cfg>
<app-params>
<!--配置文件路径设置-->
<app-param name="ConfigureFile">
<!--日志属性文件-->
<param name="LoggerConf">log4j.properties</param>
<!--MessageSource文件/.properties -->
<param name="MessageSourceConf">
evarmessages_zh_CN
</param>
<!--SpringBeanContainerConf ,spring-bean-container-mule.xml-->
<param name="BeanContainerConf">
spring-bean-container-datasource.xml,spring-bean-container-cache.xml,spring-b ean-container.xml,spring-bean-container-racs.xml
</param>
</app-param>
</app-params>
</app-cfg>
</evar-app>
2.2.2日志配置文件
配置文件名称一般为log4j.properties,该文件的配置遵循Log4j日志框架。

例子:
2.2.3数据库连接配置文件
配置文件名称一般为spring-bean-container-datasource.xml,该文件的配置遵循Spring框架。

例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="mons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>com.sybase.jdbc3.jdbc.SybDriver</value>
</property>
<property name="url">
<value>jdbc:sybase:Tds:192.168.103.100:5000/bod</value>
</property>
<property name="username">
<value>bod</value>
</property>
<property name="password">
<value>****</value>
</property>
<property name="initialSize" value="26" />
<property name="maxActive" value="50" />
<property name="maxIdle" value="26" />
<property name="testOnBorrow" value="true"/>
<property name="validationQuery" value="select count(*) from ts001 where 1=0"/>
</bean>
</beans>
2.2.4cache配置文件
配置文件名称一般为spring-bean-container-cache.xml,该文件的配置遵循Spring 框架,共有4种cache机制:
1.Memcached,多个进程可以共享cache;
例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"/dtd/spring-beans.dtd">
<beans>
<!-- cache -->
<!-- memcahed -->
<bean id="cache" class="eet.evar.core.cache.MemCache" singleton="true"
init-method="init" destroy-method="destroy">
<property name="refreshPeriod">
<value>60</value>
</property>
<property name="servers">
<list>
<value>221.236.1.129:11211</value>
<value>221.236.1.129:11212</value>
</list>
</property>
<property name="weights">
<list>
<value>1</value>
<value>1</value>
</list>
</property>
<property name="maintThreadSleep">
<value>30000</value>
</property>
</bean>
</beans>
2.OSCache,进程内cache,使用了opensymphony公司的oscache框架;例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"/dtd/spring-beans.dtd">
<beans>
<!-- cache -->
<!-- OSCache -->
<bean id="cache" class="eet.evar.core.cache.OSCache" singleton="true" init-method="init" destroy-method="destroy">
<property name="refreshPeriod">
<value>600</value>
</property>
</bean>
</beans>
另外,使用时需要oscache.properties这个配置文件,内容可以为空,需要放在classes目录下。

3.MapCache,简单的使用map作为内存容器的cache。

例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"/dtd/spring-beans.dtd">
<beans>
<!-- cache -->
<!-- MapCache -->
<bean id="cache" class="eet.evar.core.cache.MapCache" singleton="true" init-method="init" destroy-method="destroy">
</bean>
</beans>
4.DumpCache,一个什么也不做的cache,相当于没有使用cache;
例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"/dtd/spring-beans.dtd">
<beans>
<!-- cache -->
<!-- DumpCache -->
<bean id="cache" class="eet.evar.core.cache.DumpCache" singleton="true"
init-method="init" destroy-method="destroy">
</bean>
</beans>
2.2.5Spring的主配置文件
配置文件名称一般为spring-bean-container.xml,该文件的配置遵循Spring框架;
修改数据库类型时,需要修改hibernate.dialect配置项目。

增加hbm.xml文件时,在该配置文件中修改。

例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"/dtd/spring-beans.dtd">
<beans>
<bean id="finderIntroductionAdvisor"
class="eet.evar.framework.bean.genericdao.finder.impl.FinderIntroductionA dvisor" />
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"
>
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<value>
create=PROPAGATION_REQUIRED
read=PROPAGATION_REQUIRED,readOnly
update=PROPAGATION_REQUIRED
delete=PROPAGATION_REQUIRED
*=PROPAGATION_REQUIRED,readOnly
*.*=PROPAGATION_REQUIRED,readOnly
</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="abstractTransactionDao"
class="org.springframework.aop.framework.ProxyFactoryBean"
abstract="true">
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<value>finderIntroductionAdvisor</value>
</list>
</property>
</bean>
<bean id="abstractTransactionCacheDao"
class="org.springframework.aop.framework.ProxyFactoryBean"
abstract="true">
<property name="interceptorNames">
<list>
<value>cacheIntroductionInterceptor</value>
<value>transactionInterceptor</value>
<value>finderIntroductionAdvisor</value>
</list>
</property>
</bean>
<!-- Cache IntroductionInterceptor -->
<bean id="cacheIntroductionInterceptor"
class="eet.evar.framework.bean.genericdao.cache.impl.CacheIntroductionIn terceptor">
<property name="cache">
<ref bean="cache" />
</property>
<property name="findMethodCacheEnable">
<value>true</value>
</property>
</bean>
<bean id="abstractDaoTarget"
class="eet.evar.framework.bean.genericdao.impl.GenericDaoHibernateImpl"
abstract="true">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
<property name="namingStrategy">
<ref bean="extendedFinderNamingStrategy" />
</property>
</bean>
<bean id="extendedFinderNamingStrategy"
class="eet.evar.framework.bean.genericdao.finder.impl.ExtendedFinderNa mingStrategy" />
<bean id="namingStrategy"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBea n">
<property name="staticField">
<value>org.hibernate.cfg.ImprovedNamingStrategy.INSTANCE</value> </property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="namingStrategy">
<ref bean="namingStrategy" />
</property>
<property name="mappingResources">
<list>
<value>eet/evar/net/messagepkg/Command.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop
key="hibernate.dialect">org.hibernate.dialect.SybaseDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.connection.release_mode">
after_transaction
</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- Dao Layer Instances -->
<bean id="commandStructDao" parent="abstractTransactionCacheDao"> <property name="proxyInterfaces">
<value>mandStructDao</value> </property>
<property name="target">
<bean parent="abstractDaoTarget">
<constructor-arg>
<value>mandStruct</value> </constructor-arg>
</bean>
</property>
</bean>
<bean id="commandFieldDao" parent="abstractTransactionCacheDao"> <property name="proxyInterfaces">
<value>mandFieldDao</value> </property>
<property name="target">
<bean parent="abstractDaoTarget">
<constructor-arg>
<value>mandField</value> </constructor-arg>
</bean>
</property>
</bean>
<bean id="fieldTypeDao" parent="abstractTransactionCacheDao"> <property name="proxyInterfaces">
<value>.messagepkg.FieldTypeDao</value>
</property>
<property name="target">
<bean parent="abstractDaoTarget">
<constructor-arg>
<value>
mandFieldType
</value>
</constructor-arg>
</bean>
</property>
</bean>
<bean id="interfaceConfigureDao" parent="abstractTransactionCacheDao"> <property name="proxyInterfaces">
<value>.messagepkg.InterfaceConfigureDao</value> </property>
<property name="target">
<bean parent="abstractDaoTarget">
<constructor-arg>
<value>
.messagepkg.InterfaceConfigure
</value>
</constructor-arg>
</bean>
</property>
</bean>
<!-- Dao Layer Instances End -->
<!-- Service Layer Instances -->
<!-- 鍛戒护鏈嶅姟-->
<bean id="commandServiceTarget"
class="mandService">
<property name="commandStructDao">
<ref bean="commandStructDao" />
</property>
<property name="commandFieldDao">
<ref bean="commandFieldDao" />
</property>
<property name="fieldTypeDao">
<ref bean="fieldTypeDao" />
</property>
<property name="interfaceConfigureDao">
<ref bean="interfaceConfigureDao" />
</property>
</bean>
<bean id="commandService"
class="org.springframework.transaction.interceptor.TransactionProxyFactor yBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="proxyTargetClass" value="true" />
<property name="target">
<ref bean="commandServiceTarget" />
</property>
<property name="transactionAttributes">
<props>
</props>
</property>
</bean>
<!-- Service Layer Instances End -->
</beans>
2.3 使用原则
2.3.1项目目录结构
项目目录结构一般设置如下:
logs
classes
lib
src
config
java
test
ice
logs目录存放日志文件
classes目录存放编译后的文件
lib目录存放jar文件
src/config目录存放配置文件
src/java目录存放源文件
src/test目录存放单元测试类文件
src/ice目录存放ice相关的文件
源文件目录设置:
一般以com.eastelsoft.xxxx开始,其中xxxx为项目名称。

在项目名称下建立如下目录:
domain,存放dao、hbm.xml、实体类;
service,存放服务类
job,存放作业类
config,存放配置文件处理类
net,存放网络处理类
2.3.2Jdk版本
Jdk1.5
2.3.3框架启动
// 配置文件初始化
SysConfiguration.instance(configureFile);
// 序列器生成器初始化
SerialNumber.instance();
// 日志管理器初始化
String logConfFile = SysConfiguration.getParamFromCfg(
"ConfigureFile", "LoggerConf");
Logger.instance(logConfFile);
// 初始化bean容器
String beansConfFiles = SysConfiguration.getParamFromCfg(
"ConfigureFile", "BeanContainerConf");
String[] configures = null;
if (beansConfFiles != null) {
configures = StringDeal.split(beansConfFiles, ",");
}
EvarBeanFactory.instance(configures);
2.3.4框架关闭
//销毁bean容器
EvarBeanFactory.destroy();
2.3.5使用例子
//获得容器对象
CommandService commandService = (CommandService) EvarBeanFactory .instance().makeBean("commandService");
//调用对象方法
return commandService.readCommandStruct(commandID);
3数据库存储框架
3.1 框架原理
Hibernate框架,版本Hibernate3。

3.2 创建实体类
一般的实体类与数据中的表一一对应。

实体类需要实现的接口:java.io.Serializable。

实体类必须要有的方法:getId(),setId(),用于获取和设置主键;一般我们需要为实体类设置默认主键值,根据主键类型设置不同的默认值:string类型的主键设置为uuid;没有默认认主键值时,需要程序员来设置。

例子1,String类型的主键:
例子2,复合类型的主键,就是说表有2个或2个以上的主键:
3.3 创建hbm.xml文件
hbm.xml是实体类与数据库表的映射文件,一般与数据中的表一一对应,文件名称一般为实体类名称加.hbm.xml。

例子1:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"/hibernate-mapping-3.0.dtd">
<!-- Generated 2006-11-8 11:29:17 by Hibernate Tools 3.2.0.beta8 -->
<hibernate-mapping package="com.eastelsoft.evarbpm.domain">
<class name="EfWorkitem" table="ef_to_do_workitem">
<id name="Id" type="ng.String">
<column name="work_id" length="36"/>
<generator class="assigned" />
</id>
<version name="version" column="version" unsaved-value="null"/>
<property name="workName" type="ng.String">
<column name="work_name" length="128" />
</property>
<property name="serialNo" type="ng.String">
<column name="serial_no" />
</property>
<property name="entityId" type="ng.String">
<column name="entity_id" length="256" />
</property>
<property name="status" type="ng.Integer">
<column name="status" />
</property>
<property name="currActId" type="ng.Integer">
<column name="curr_act_id" />
</property>
<property name="preActId" type="ng.Integer">
<column name="pre_act_id" />
</property>
<property name="createdDate" type="java.util.Date">
<column name="created_date" />
</property>
<property name="acceptedDate" type="java.util.Date">
<column name="accepted_date" />
</property>
<property name="groupId" type="ng.String">
<column name="group_id" />
</property>
<property name="userId" type="ng.String">
<column name="user_id" />
</property>
<property name="grantorId" type="ng.String">
<column name="grantor_id" length="32" />
Evar框架开发手册杭州东创科技有限公司</property>
<property name="delegateUserId" type="ng.String">
<column name="delegate_id" />
</property>
<property name="srcWorkId" type="ng.String">
<column name="src_work_id" />
</property>
<property name="flowId" type="ng.String">
<column name="flow_id" length="32" />
</property>
<property name="entryId" type="ng.String">
<column name="entry_id" />
</property>
<property name="stepId" type="ng.Integer">
<column name="step_id" />
</property>
<property name="availableActions" type="ng.String"> <column name="available_actions" />
</property>
<property name="stepName" type="ng.String">
<column name="step_name" />
</property>
<property name="entryOwner" type="ng.String">
<column name="entry_owner" />
</property>
<property name="entryCreatedDate" type="java.util.Date"> <column name="entry_created_date" />
</property>
<property name="assignUserId" type="ng.String">
<column name="assign_user_id" />
</property>
<property name="preOperUserId" type="ng.String"> <column name="pre_oper_user_id" />
</property>
<property name="deadLine" type="java.util.Date">
<column name="dead_line" />
</property>
<property name="workType" type="ng.Integer">
<column name="work_type" />
</property>
<property name="orMergeFlag" type="ng.Integer">
<column name="or_merge_flag" />
</property>
<property name="numVotesNeeded" type="ng.Integer">
<column name="num_votes_needed" />
</property>
</class>
<query name="EfWorkitem.findByUserId">
<![CDATA[select work from EfWorkitem work where erId=? order by work.createdDate]]>
</query>
<query name="EfWorkitem.findByGroupId">
<![CDATA[select work from EfWorkitem work where work.groupId=? order by work.createdDate]]>
</query>
<query name="EfWorkitem.findBySerialNo">
<![CDATA[select work from EfWorkitem work where
work.serialNo=?]]>
</query>
<query name="EfWorkitem.findByEntryId">
<![CDATA[select work from EfWorkitem work where work.entryId=? order by work.createdDate]]>
</query>
<query name="EfWorkitem.findByEntryOwner">
<![CDATA[select work from EfWorkitem work where
work.entryOwner=?]]>
</query>
<query name="EfWorkitem.findByUserIdAndEntryId">
<![CDATA[select work from EfWorkitem work,EfWorkitemOwner workOwner where work.Id=workOwner.workId and erId=? and work.entryId=?]]>
</query>
</hibernate-mapping>
例子2:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"/hibernate-mapping-3.0.dtd">
<!-- Generated 2008-3-24 11:06:47 by Hibernate Tools 3.2.0.b9 -->
<hibernate-mapping>
<class name="com.eastelsoft.etos2.domain.EngineConnectCP"
table="TI_ENGINE_CONNECT_CP">
<composite-id name="id"
class="com.eastelsoft.etos2.domain.EngineConnectCPId" unsaved-value="any"> <key-property name="engineId" column="ENGINE_ID"
type="ng.String"/>
<key-property name="capabilityProviderId"
column="CAPABILITY_PROVIDER_ID" type="ng.String"/>
</composite-id>
<property name="createdtime" type="java.util.Date">
<column name="CREATED_TIME"/>
</property>
<property name="state" type="int">
<column name="STATE" length="6"/>
</property>
<property name="effectiveBeginTime" type="java.util.Date">
<column name="EFFECTIVE_BEGIN_TIME"/>
</property>
<property name="effectiveEndTime" type="java.util.Date">
<column name="EFFECTIVE_END_TIME"/>
</property>
<property name="recentlyModTime" type="java.util.Date">
<column name="RECENTLY_MOD_TIME"/>
</property>
<property name="recentlyModOper" type="string">
<column name="RECENTLY_MOD_OPER" length="32"/> </property>
<property name="demo" type="string">
<column name="DEMO" length="120"/>
</property>
</class>
<query name="EngineConnectCP.findByEngineId">
<![CDATA[select o from EngineConnectCP o where o.id.engineId=? order by o.id]]>
</query>
</hibernate-mapping>
例子2:
3.4 创建dao类
dao类是操作实体类的接口,,一般与数据中的表一一对应,文件名称一般为实体类名称加Dao.java。

dao接口需要继承的接口:eet.evar.framework.bean.genericdao.GenericDao。

GenericDao包含了4个接口:create(),read(),update(),delete(),用于基本的创建、读取、修改和删除操作。

另外,可以增加指自定义的查询方法来查数据,这些自定义方法名称有固定的格式:必须以findBy开始,方法可以由0个或多个参数,这些方法与hbm.xml中的名称查询名称想对应,如:接口EfWorkitemDao中的findByUserId方法,与3.3中EfWorkitem.hbm.xml中命名查询findByUserId相互对应。

例子:
package com.eastelsoft.evarbpm.domain.dao;
import java.util.List;
import com.eastelsoft.evarbpm.domain.EfWorkitem;
import eet.evar.framework.bean.genericdao.GenericDao;
public interface EfWorkitemDao extends GenericDao<EfWorkitem, String> { public List<EfWorkitem> findByUserId(String userId);
public List<EfWorkitem> findByUserIdAndEntryId(String userId, String entryId);
public List<EfWorkitem> findByGroupId(String groupId);
public List<EfWorkitem> findByDeleUserId(String deleUserId);
public List<EfWorkitem> findBySerialNo(String serialNo);
public List<EfWorkitem> findByEntryId(String entryId);
public List<EfWorkitem> findByEntryOwner(String entryOwner);
}
3.5 创建服务类
服务类主要用于处理和封装业务逻辑,并调用dao来实现数据库操作;服务类的另一个作用是数据库事务控制,而事务的控制可以通过sping的配置文件来实现。

如:
<bean id="cpCapacityServiceTarget"
class="com.eastelsoft.etos2.service.impl.CPCapacityService">
<property name="capacityAttrTypeDao" ref="capacityAttrTypeDao" />
<property name="capacityAttrSlaRelaDao"
ref="capacityAttrSlaRelaDao" />
<property name="engineCapacityDao" ref="engineCapacityDao" />
<property name="engineCpCapacityDao" ref="engineCpCapacityDao" />
<property name="engineCapabilityProviderDao"
ref="engineCapabilityProviderDao" />
<property name="engineDao" ref="engineDao" />
<property name="engineConnectCPDao" ref="engineConnectCPDao" /> </bean>
<bean id="cpCapacityService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBe an">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="proxyTargetClass" value="true" />
<property name="target">
<ref bean="cpCapacityServiceTarget" /> </property>
<property name="transactionAttributes">
<props>
</props>
</property>
</bean>
我们可以在transactionAttributes中进行事物控制。

4日志模块
4.1 原理
采用Log4j开源日志框架。

4.2 使用
4.2.1配置文件
默认使用log4j.properties为配置文件名称,默认路径在classes目录下;例子:
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# /licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#。

相关文档
最新文档