`

Spring 杂文

阅读更多
1.配置文件转换成对应的注解形式
<bean id="exampleBean" factory-bean="serviceLocator" factory-method="createInstance"/>
在 @Confiuration 的类直接使用 @Bean...
@Confiugration
public class AppConfig{
@Bean
Instance yourInstance(){
return InstanceFactory.createInstance();
}
}
2.Spring的DAO被强制用接口的原因
Spring IOC本身是不会强制基于接口的,但DAO类一般要使用Spring的声明式事务机制,而声明式的事务机制是使用Spring AOP来实现的。Spring AOP的实现机制包括动态代理和Cgilib2,其中Spring AOP默认使用的Java动态代理是必须基于接口,所以就要求基于接口了。
注意:如果有时需要对多个dao进行事物的一致性处理(有一个dao操作失败时,要进行全部回滚),可能会将事物作用于service方法上,所以这时如果是使用spring AOP的声明式事物处理的话就也会使用java动态代理的方式。即也许要service是基于接口编程的。
解决办法就是:让事物代理使用CGlib的形式。
<bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
id="baseService"   abstract="true">
  <property name="transactionManager" ref="transactionManager"/>
  <property name="proxyTargetClass" value="true"/>

</bean>
3.spring本身是个容器,管理着注入容器的组件。但是实例话这些组件并非是通过new关键字的,而是通过反射。Class.forName()
4.spring aop配置实例
<bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
 
    <tx:advice id="txAdvice" transaction-manager="transactionManager">  
        <tx:attributes>  
            <tx:method name="save*" propagation="REQUIRED" />  
            <tx:method name="del*" propagation="REQUIRED" />  
            <tx:method name="update*" propagation="REQUIRED" />  
            <tx:method name="*" read-only="true" />  
        </tx:attributes>  
    </tx:advice>  
    <aop:config>  
        <aop:pointcut id="allManagerMethod" 
            expression="execution(* byd.service.impl.*.*(..))" />  
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />  
    </aop:config>
5.事物的传播性
常见的事物传播规则有如下几种:

1).PROPAGATION_MANDATORY: 要求调用该方法的线程必须处于事务环境中,否则抛出异常;
2).PROPAGATION_NESTED:如果执行该方法的线程已处于事务环境下,依然启动新的事务,方法在嵌套的事务里执行。如果执行该方法的线程并未处于事务中,也启动新的事务,然后执行该方法,此时与 PROPAGATION_REQUIRED相同;
3).PROPAGATION_NEVER:不允许调用该方法的线程处于事务环境下,如果调用该方法的线程处于事务环境下,则抛出异常;
4). PROPAGATION_NOT_SUPPORTED:如果调用该方法的线程处于事务中,则先暂停当前事务,然户执行该方法;
5).PROPAGATION_REQUIRED:要求在事务环境中执行该方法,如果当前线程已处于事务中,则直接调用,然后执行该方法;
6).PROPAGATION_REQUIRES_NEW:该方法要求有一个在新的事务环境中执行,如果当前线程已处于事务中,先暂停当前事务,启动新事务后执行该方法,如果当前调用线程不处在事务中,则启动新的事务方法后执行方法;
7).PROPAGATION_SUPPORTS:如果当前执行线程处于事务中,则执行当前事务,否则不使用事务。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics