spring学习笔记

来源:互联网 发布:方舟生存进化优化了吗 编辑:程序博客网 时间:2024/05/16 14:04

Spring中两个十分重要的概念——IOC/DI & AOP

1.IOC/DI(Inverse of control/Dependence Injection)
IOC:控制反转,看起来比较牛B,说起来十分简单。就是不使用传统的将类的依赖关系用硬编码来维护的方式,而是让容器来管理类之间的依赖,依赖关系在全在一个配置文件上。这样,就将造成耦合的根源——复杂的依赖关系,进行了统一的,集约式管理。

DI:依赖注入,其实就是控制反转。只是比IOC的表达稍微好点,更能望文生意些。依赖注入,简单地说,就是在运行期间,由容器将组件之间的依赖关系注入到组件中。

 IOC/DI的作用:有了这样的设计,我们只需要专心编写一个个高内聚的零件,而不用关心这些零件如何组合起来工作。这个问题是由依赖关系的配置文件需要关注的。这样将组件和依赖分离,提高了组件的可重用性。

 

IoC的配置:

<!-- dao层 -->
 <bean id="Hibernate-loginuserDAO" class="com.softeem.dao.hibernate.UserDAO">
  <property name="factory" ref="sessionFactory"/>
 </bean>
 
 <!-- service层 -->
 <bean id="loginService" class="com.softeem.service.LoginService">
  <property name="userDAO" ref="Hibernate-loginuserDAO"/>
 </bean>
 
 <!-- Action层 -->
 <bean id="userAction" class="com.softeem.struts2.UserAction" scope="prototype" >
  <property name="loginService">
   <ref local="loginService"/>
  </property>
 </bean>

IoC是面向组件编程的一种编程思想。组件与组件的依赖关系,本来是程序员来管理,现在我们反转给IoC容器完成,我们只需要专心编写一个个组件,而不用关心这些组件如何组合起来工作。

<!-- dao层 --><!-- service层 --><!-- Action层 -->三层体系架构,层次关系一目了然。

 

2.AOP(Aspect Oriented Programming)

AOP:翻译为面向切面编程。我个人认为,说成是面向动作编程好象更加贴切。因为AOP是将某类动作高度内聚的编程方法。

 AOP在Spring中的应用:事务管理机制。spring的事务管理是通过AOP代理实现的。

 

spring的声明式事务:
spring引人注目的重要因素之一是它全面的事务支持。spring提供了一致的事务管理抽象,为复杂的事务API提供了一致的编程模型,如JTA、JDBC、hibernate、JPA和JDO,并且支持声明式事务。

spring的事务管理分为编程式事务和声明式事务,用得最多的是声明式事务。

声明式事务的配置:

 <!-- transaction声明式事务 -->
 <tx:advice id="txAdvice" transaction-manager="Hibernate-TxManager">
  <tx:attributes>
   <tx:method name="check*" read-only="true"/>
   <tx:method name="find*" read-only="true"/>
   <tx:method name="to*" read-only="true"/>
   <tx:method name="*"/>
  </tx:attributes>
 </tx:advice>
 
 <aop:config>
  <aop:pointcut id="loginuserService" expression="execution(* com.softeem.service.*.*(..))"/>
  <aop:advisor pointcut-ref="loginuserService" advice-ref="txAdvice"/>
 </aop:config>

 

 声明式事务就是只需在配置文件里面声明就可以使用,通过expression="execution(* com.softeem.service.*.*(..))"表达式通配符来管理哪些类的哪些方法需要使用事务,read-only="true"表示只读,就是不使用事务,默认的是false,使用事务。一般的,查询数据不用事务,其他要使用。

 

有时候工程跑起来调用了相关DAO的方法,但是hibernate就是没有发出相应的sql语句,往往就是因为事务的管理出错,本来要使用事务的地方没使用,使得事务回滚,这里要注意下。

 

以上是spring的核心技术,但是spring里面的内容远不止这些,其他的内容有待进一步研究。希望大家看完能有所收获。
 

原创粉丝点击