java

位置:IT落伍者 >> java >> 浏览文章

开源技术分析:AOP和Spring事务处理


发布日期:2023年09月13日
 
开源技术分析:AOP和Spring事务处理

为什么要用框架和模式

为什么要用模式?

因为模式是一种指导在一个良好的指导下有助于你完成任务有助于你作出一个优良的设计方案达到事半功倍的效果而且会得到解决问题的最佳办法

为什么要用框架?

因为软件系统发展到今天已经很复杂了特别是服务器端软件设计到的知识内容问题太多在某些方面使用别人成熟的框架就相当于让别人帮你完成一些基础工作你只需要集中精力完成系统的业务逻辑设计而且框架一般是成熟稳健的他可以处理系统很多细节问题比如事物处理安全性数据流控制等问题还有框架一般都经过很多人使用所以结构很好所以扩展性也很好而且它是不断升级的你可以直接享受别人升级代码带来的好处

总之:就是让开发更简单让我们成功

AOP

AOP是什么?

AOP是OOP的延续是Aspect Oriented Programming的缩写意思是面向方面编程AOP实际是GoF设计模式的延续设计模式孜孜不倦追求的是调用者和被调用者之间的解耦AOP可以说也是这种目标的一种实现

切面意义何在?

就可以在这层切面上进行统一的集中式权限管理而业务逻辑组件则无需关心权限方面的问题也就是说通过切面我们可以将系统中各个不同层次上的问题隔离开来实现统一集约式处理各切面只需集中于自己领域内的逻辑实现这一方面使得开发逻辑更加清晰专业化分工更加易于进行另一方面由于切面的隔离降低了耦合性我们就可以在不同的应用中将各个切面组合使用从而使得代码可重用性大大增强

AOP应用范围

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading懒加载

Debugging调试

logging tracing profiling and monitoring记录跟蹤优化校准

Performance optimization性能优化

Persistence持久化

Resource pooling资源池

Synchronization同步

Transactions 事务

Spring事务处理

Spring事务管理能给我们带来什么?

对于传统的基于特定事务资源的事务处理而言(如基于JDBC 的数据库访问)Spring并不会对其产生什么影响我们照样可以成功编写并运行这样的代码同时Spring还提供了一些辅助类可供我们选择使用这些辅助类简化了传统的数据库操作流程在一定程度上节省了工作量提高了编码效率

对于依赖容器的参数化事务管理而言Spring则表现出了极大的价值Spring本身也是一个容器只是相对EJB容器而言Spring显得更为轻便小巧我们无需付出其他方面的代价即可通过Spring实现基于容器的事务管理(本质上来讲Spring的事务管理是基于动态AOP)

Hibernate in Spring

applicationContextxml

<! Hibernate SessionFactory ><bean id=sessionFactory

class=orgspringframeworkormhibernateLocalSessionFactoryBean>

<property name=dataSource><ref local=dataSource /></property>

<property name=mappingResources>

<list><! Add list of hbmxml files here >

<value>org/mzone/model/Tuserhbmxml</value>

<value>org/mzone/model/Articlehbmxml</value>

</list>

</property>

<property name=hibernateProperties>

<props>

<propkey=hibernatedialect>netsfhibernatedialectSybaseDialec</prop>

<prop key=hibernateshow_sql>True</prop>

</props>

</property>

</bean><! Transaction manager for a single Hibernate SessionFactory (alternative to JTA) >

<bean id=transactionManager

class=orgspringframeworkormhibernateHibernateTransactionManager>

<property name=sessionFactory><ref local=sessionFactory /></property>

</bean>

<bean id=baseTxProxy lazyinit=true

class=orgspringframeworktransactioninterceptorTransactionProxyFactoryBean>

<property name=transactionManager><ref bean=transactionManager/></property>

<property name=target>

<ref local= userManagerTarget />

</property>

<property name=transactionAttributes>

<props>

<prop key=save*>PROPAGATION_REQUIRED</prop>

<prop key=get*>PROPAGATION_REQUIREDreadOnly</prop>

<prop key=remove*>PROPAGATION_REQUIRED</prop>

<prop key=*>PROPAGATION_REQUIRED</prop>

</props>

</property>

</bean>

<bean id=userManagerTarget class=orgmzoneserviceimplUserManagerImpl>

<property name=userDAO><ref local=userDAO/></property>

<property name=articleDao><ref local=articleDAO/></property>

</bean>

UserDAOjava ArticleDAOjava

public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {

public void saveUser(Tuser user) {

getHibernateTemplate()saveOrUpdate(user);

}}public class ArticleDAOImpl extends HibernateDaoSupport implements ArticleDAO {

public void saveArticle(Article article) {

getHibernateTemplate()saveOrUpdate(article);

}}

HibernateDaoSupport

实现了HibernateTemplate和SessionFactory实例的关联HibernateTemplate对Hibernate Session操作进行了封装而HibernateTemplateexecute方法则是一封装机制的核心感兴趣可以研究一下其实现机制

借助HibernateTemplate我们可以脱离每次数据操作必须首先获得Session实例启动事务提交/回滚事务以及烦杂的try/catch/finally的繁琐操作从而获得以上代码中精干集中的逻辑呈现效果

orgmzoneserviceimplUserManagerImpl

public class UserManagerImpl implements UserManager {

private UserDAO userDao;

private ArticleDAO articleDao;

public void saveUserAndArticle(Tuser user Article article) {

userDaosaveUser(user);

articleDaosaveArticle(article);

}}

测试代码

InputStream is = new FileInputStream(applicationContextxml);

XmlBeanFactory factory = new XmlBeanFactory(is);UserManager userManager =

(UserManager )factorygetBean( baseTxProxy );

user = new Tuser();

article = new Article();

usersetUsername(hellboys_topic );

usersetPassword(_topic );

articlesetTitle(hellboys_topic );

articlesetContent(hellboys_topic );

userManagersaveUserAndArticle(userarticle);

注意问题

UserManager userManager =

(UserManager )factorygetBean( baseTxProxy );UserManager userManager =

(UserManagerImpl) ctxgetBean(baseTxProxy);javalangClassCastException

原因在于Spring的AOP实现机制前面曾经提及Spring中的事务管理实际上是基于动态AOP机制实现为了实现动态AOPSpring在默认情况下会使用Java DynamicProxy但是Dynamic Proxy要求其代理的对象必须实现一个接口该接口定义了准备进行代理的方法而对于没有实现任何接口的Java Class需要采用其他方式Spring通过CGLib实现这一功能

CGLib可以在运行期对Class行为进行修改由于其功能强大性能出众常常被作为Java Dynamic Proxy

之外的动态Proxy模式的实现基础在SpringHibernate中都用到了CGLib类库

上一篇:struts框架中使用tiles组件代码实例

下一篇:Spring Framework的理解以及可维护性的思考