??xml version="1.0" encoding="utf-8" standalone="yes"?> 二、测试代码:(x) 上面q段配置文g规定?jin)在早?点和晚上8Ҏ(gu)行financeDAO对象的confirmOrder()Ҏ(gu).
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<!-- bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- Hibernate Transaction Interceptor Definition -->
<bean id="hibernateTransactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"
parent="transactionIntercetorTemplate">
<property name="transactionManager">
<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</property>
</bean>
<!-- Transction Intercetor's Template -->
<bean id="transactionIntercetorTemplate" abstract="true">
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-BussException</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定义自动代理生成?/span>-->
<bean id="autoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<idref bean="hibernateTransactionInterceptor" />
<idref bean="jdbcTransactionInterceptor" />
</list>
</property>
<property name="beanNames">
<value>*Service</value>
<!--list>
<idref bean="bookService" />
</list-->
<!--dService bean-->
</property>
</bean>
<bean id="hibernateDaoTemplate" abstract="true">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- Dao 定义 -->
<bean id="imageDao" class="com.fbyssssite.dao.ImageDao"
parent="hibernateDaoTemplate" />
<bean id="imageFolderDao" class="com.fbyssssite.dao.ImageFolderDao"
parent="hibernateDaoTemplate" />
<!-- Service 定义 -->
<bean id="imageService" class="com.fbyssssite.bo.ImageService" autowire="byName">
<property name="dao" ref="imageDao"></property>
</bean>
<bean id="imageFolderService" class="com.fbyssssite.bo.ImageFolderService" autowire="byName">
<property name="dao" ref="imageFolderDao"></property>
</bean>
public void delete(Object entity,IBaseUser user) throws BussException {
super.delete(entity, user);
ImageFolder folder = (ImageFolder)entity;
String folderId = folder.getId();
IImageService imageService = ServiceFactory.getImageService();
imageService.deleteAllInFolder(folderId,user);
}
public void deleteAllInFolder(String id,IBaseUser sysUser) throws BussException {(来源:www.iocblog.net)
log.info("删除囄?"+id+"'中的囄...");
throw new BussException(1,"临时试Q测试事务是否生效的异常。测试完毕后删除此语句?/span>",log);
/*
StringBuffer sql = new StringBuffer("delete ");
sql.append("from ");
sql.append(getEntityClassName());
SqlBuilder sqlBuilder = SqlBuilder.getInstance();
sqlBuilder.appendWhereCondition(sql, "folderId='"+id+"'");
bulkUpdate(sql.toString(), sysUser);
*/
}
三、测试效果:(x)
抛出BussException之后QimageFolder实体q没有被删除Q而是回滚?jin)?br />
四、注意事:(x)
1.其中?nbsp;BussException是一个CheckedException(l承自Exception)Q这里不q是一个例子,如果其他Ҏ(gu)需要同L(fng)方式处理事务Q也要加?BussExceptionQ否则不能回滚;如果是一个UnCheckedExceptionQ就不需要在q里配置Q默认就?x)回滚?br />
2.如果采用MySQLQshow table status可以查看表的ENGINEcdQMyISAM是不支持事务的,如果需要事务,应该Ҏ(gu)InnoDB:alter table [tablename] engine = InnoDB;
]]>
]]> <bean id="methodInvokingJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"><ref bean="financeDAO"/></property>
<property name="targetMethod"><value>confirmOrder</value></property>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail"/>
</property>
<property name="cronExpression">
<value>0 0 6,12,20 * * ?</value>
</property>
</bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref local="cronTrigger"/></list>
</property>
</bean>
附:(x)cronExpression配置说明
字段
允许?/th>
允许的特D字W?/th>
U?/code>
0-59
, - * /
?/code>
0-59
, - * /
时
0-23
, - * /
日期
1-31
, - * ? / L W C
月䆾
1-12 或?JAN-DEC
, - * /
星期
1-7 或?SUN-SAT
, - * ? / L C #
q_(d)可选)(j)
留空, 1970-2099
, - * /
PropertyEditor
用于把字符串从java.lang.String
cd转化为实际的属性或参数cd?br />
所以可以放?j)的使?lt;value/>注入int{非Stringcd
NB: A bean that implements this interface cannot be used as a normal bean. A FactoryBean is defined in a bean style, but the object exposed for bean references is always the object that it creates.
FactoryBeans can support singletons and prototypes, and can either create objects lazily on demand or eagerly on startup.
This interface is heavily used within the framework, for example for the AOP ProxyFactoryBean or JndiObjectFactoryBean. It can be used for application components, but this is not common outside of infrastructure code.
使用hibernate的配|如下:(x)
<bean id="transactionManager" class="org.springframework.
orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
TransactionAttribute
instances (or Strings to be converted to TransactionAttribute
instances).
1. ?/span>advicel粒度的控制Q可以通过pointcutcL控制?/span>
2. advisor?/span>advice?/span>pointcut的集合体?/span>
3. 控制Ҏ(gu)如下Q?/span>
a) 定义Pointcut中的ClassFilter实现cdMethodMatcher实现c,完成?/span>class?/span>methodҎ(gu)?/span>advice的控Ӟ其中MethodMatcher中的matches(Method method, Class targetClass)Ҏ(gu)是对class?/span>method的双重ƈ集控?/span>
b) 定义新的Pointcut实现c,q将ClassFilter实现cdMethodMatcher实现c赋?/span>
c) 定义新的advisorq且实现PointcutAdvisor接口
d) 在定义的advisor中?/span>PointcutAdvisor接口中的getPointcut()?/span>getAdvice()?/span>Pointcut的实现类和需要的adviceq行传?/span>
e) 最后在application-context.xml中将
<bean id="XXXX"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="InterceptorNames">
<list>
<idref local="定义新的advisor?/span>id">
</list>
<property>
</bean>
<bean id="定义新的advisor?/span>id" class="定义新的advisor的类 " >
</bean>
4. Z(jin)使用?rn)态的PointcutQ可以?/span>StaticMethodMatcherPointcutQ这时?/span>
public final boolean isRuntime()
{
return false;
}
便不能修改了(jin)。也是?rn)态的Pointcut
5. 更简单的是?/span>NameMatchMethodPointcutAdvisorQ这里一?/span>advisor只有一?/span>advice
Spring学习(fn)?j)得Q四Q?/span>
1. Spring?/span>Strutsq接Qؓ(f)?jin)?/span>Struts中?/span>Spring ,需要在Struts?/span>congfig中加?/span>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/>
</plug-in>
2. 对于action?/span>Spring的应用有两种Ҏ(gu)Q?/span>
a) Extends ActionSupportQ用其中的getWebApplicationContext()得到ApplicationContextQ在通过getBean()Ҏ(gu)得到所需要的c,不过q样的话Struts和Spring耦合在一起了(jin)?/span>
b) 重新Delegating actions Q在Struts?/span>congfigq行配置Q?/span>
<action path="/XXXX"
type="org.springframework.web.struts.DelegatingActionProxy"/>
然后?/span>Spring中进?/span>bean的配|:(x)
<bean name="/XXXX"
q里为需要用到的classQ通过Ioc来进行配|?/span>
<property name="YYYY">
<ref bean="YYYY"/>
</property>
</bean>
<bean id="YYYY" class="YYYYYY">
</bean>
当然也可以在struts中加?/span>
<controller processorClass=
"org.springframework.web.struts.DelegatingRequestProcessor"/>
q样只需要写
<action path="/XXXX"/>可以了(jin)Q?/span>DelegatingRequestProcessor能够自动分派
1. advice有四U:(x)Before advice Q?/span>After advice Q?/span>Around advice ,Throws advice
2. q四U?/span>advice分别需要承的接口?/span>
Advice type |
Interface |
Throws advice |
org.aopalliance.intercept.MethodInterceptor |
Before advice |
org.springframework.aop.BeforeAdvice |
After advice |
org.springframework.aop.AfterReturningAdvice |
Throws advice |
org.springframework.aop.ThrowsAdvice |
3Q?/span>Around advice?/span>Before advice的区别是Before advice是只要没有异常,目标Ҏ(gu)一定会(x)被调用,然?/span>Around adviceQ只有当调用MethodInvocation.proceed()后目标方法才能被调用。而且Around adviceq可以返回想q回的|(x)?/span>Object obj=invocation.proceed();