AOP与Spring控制AOP

原创 2013年12月05日 19:13:10

Spring AOP与事务代理机制

Spring提供了TransactionProxyFactoryBean作为动态代理的生成工厂,该工厂产生目标bean的动态AOP事务代理。事务代理根据所配置的事务属性自动管理事务操作。该事务代理对事务的透明管理依赖于一个在ApplicationContext范围全局可见的PlatformTransactionManager。Spring提供两个默认的事务管理器实现:DataSourceTransactionManager和JtaTransactionManager。前者只能支持单个jdbc数据源,后者可以支持多个数据源,可以做分布式事务管理。一般由容器提供支持JTA的事务管理器实现,Spring的JtaTransactionManager会自动通过JNDI检测TransactionManager或UserTransaction的存在,也可以在配置中指定JNDI的设置。如果想不依赖于容器实现分布式事务管理,可以采用开源的事务管理器实现JOTM。事务管理器必须要知道被管理的DataSource的位置,如果是DataSourceTransactionManager,在事务管理器配置中直接指定JDBC数据源的引用,如果是JtaTransactionManager,容器负责告知事务管理器需要管理的数据源。不管是哪一种情况,都需要在Dao中配置与事务管理器相对应的数据源。

 

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

AOP中的概念:

l  Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。

l  Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器

l  Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义。

l  Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知

l  Target(目标对象):代理的目标对象

l  Weave(织入):将aspects应用到target对象并导致proxy对象创建的过程称为织入。

l  Introduction(引入):在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或field。

  
  2. 切面意义何在?
  
  就可以在这层切面上进行统一的集中式权限管理。而业务逻辑组件则无需关心权限方面的问题。也就是说,通过切面,我们可以将系统中各个不同层次上的问题隔离开来,实现统一集约式处理。各切面只需集中于自己领域内的逻辑实现。这一方面使得开发逻辑更加清晰,专业化分工更加易于进行;另一方面,由于切面的隔离,降低了耦合性,我们就可以在不同的应用中将各个切面组合使用,从而使得代码可重用性大大增强。
  
  3. AOP应用范围
  
  Authentication 权限
  Caching 缓存
  Context passing 内容传递
  Error handling 错误处理
  Lazy loading 懒加载
  Debugging  调试
  logging, tracing, profiling and monitoring 记录跟踪 优化 校准
  Performance optimization 性能优化
  Persistence  持久化
  Resource pooling 资源池
  Synchronization 同步
  Transactions 事务
  
  三.Spring事务处理
  
  1.Spring事务管理能给我们带来什么?
  
  对于传统的基于特定事务资源的事务处理而言(如基于JDBC 的数据库访问),Spring并不会对其产生什么影响,我们照样可以成功编写并运行这样的代码。同时,Spring还提供了一些辅助类可供我们选择使用,这些辅助类简化了传统的数据库操作流程,在一定程度上节省了工作量,提高了编码效率。
  
  对于依赖容器的参数化事务管理而言,Spring则表现出了极大的价值。Spring本身也是一个容器,只是相对EJB容器而言,Spring显得更为轻便小巧。我们无需付出其他方面的代价,即可通过Spring实现基于容器的事务管理(本质上来讲,Spring的事务管理是基于动态AOP)。
  
  2. Hibernate in Spring
  applicationContext.xml
  
  <!-- Hibernate SessionFactory --><bean id="sessionFactory“
  class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource"><ref local="dataSource" /></property>
  <property name="mappingResources">
  <list><!-- Add list of .hbm.xml files here -->
  <value>org/mzone/model/Tuser.hbm.xml</value>
  <value>org/mzone/model/Article.hbm.xml</value>
  </list>
  </property>
  <property name="hibernateProperties">
  <props>
  <prop  key="hibernate.dialect">net.sf.hibernate.dialect.SybaseDialec</prop>
  <prop key="hibernate.show_sql">True</prop>
  </props>
  </property>
  </bean><!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
  <bean id="transactionManager"
  class="org.springframework.orm.hibernate.HibernateTransactionManager">
  <property name="sessionFactory"><ref local="sessionFactory" /></property>
  </bean>
  <bean id="baseTxProxy" lazy-init="true"
  
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <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_REQUIRED,readOnly</prop>
  <prop key="remove*">PROPAGATION_REQUIRED</prop>
  <prop key="*">PROPAGATION_REQUIRED</prop>
  </props>
  </property>
  </bean>
  <bean id="userManagerTarget" class="org.mzone.service.impl.UserManagerImpl">
  <property name="userDAO"><ref local="userDAO"/></property>
  <property name="articleDao"><ref local="articleDAO"/></property>
  </bean>
  
  UserDAO.java ArticleDAO.java
  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操作进行了封装,而HibernateTemplate.execute方法则是一封装机制的核心,感兴趣可以研究一下其实现机制。
  
  借助HibernateTemplate我们可以脱离每次数据操作必须首先获得Session实例、启动事务、提交/回滚事务以及烦杂的try/catch/finally的繁琐操作。从而获得以上代码中精干集中的逻辑呈现效果。
  
  org.mzone.service.impl.UserManagerImpl
  public class UserManagerImpl implements UserManager {
  private UserDAO userDao;
  private ArticleDAO articleDao;
  public void saveUserAndArticle(Tuser user, Article article) {
  userDao.saveUser(user);
  articleDao.saveArticle(article);
  }}
  
  测试代码
  InputStream is = new FileInputStream("applicationContext.xml");
  XmlBeanFactory factory = new XmlBeanFactory(is);UserManager userManager =
  (UserManager )factory.getBean(" baseTxProxy ");
  user = new Tuser();
  article = new Article();
  user.setUsername("hellboys_topic 1");
  user.setPassword("12345678_topic 1");
  article.setTitle("hellboys_topic 1");
  article.setContent("hellboys_topic 1");
  userManager.saveUserAndArticle(user,article);
  
  注意问题
  UserManager userManager =
  (UserManager )factory.getBean(" baseTxProxy ");UserManager userManager =
  (UserManagerImpl) ctx.getBean("baseTxProxy");java.lang.ClassCastException
  
  原因在于Spring的AOP实现机制,前面曾经提及,Spring中的事务管理实际上是基于动态AOP机制实现,为了实现动态AOP,Spring在默认情况下会使用Java DynamicProxy,但是,Dynamic Proxy要求其代理的对象必须实现一个接口,该接口定义了准备进行代理的方法。而对于没有实现任何接口的Java Class,需要采用其他方式,Spring通过CGLib10实现这一功能。
  CGLib可以在运行期对Class行为进行修改。由于其功能强大,性能出众,常常被作为Java Dynamic Proxy
  之外的动态Proxy模式的实现基础。在Spring、Hibernate中都用到了CGLib类库。

Spring AOP 实现机制

1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP。 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较...
  • dreamthen
  • dreamthen
  • 2014年05月23日 11:43
  • 36163

数据库事务的四大特性、隔离级别以及Spring中如何利用AOP进行事务管理

首先,什么是事务? 事务就是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么成功,要么失败。 其次,事务的特性有哪些? 1.原子性。 例如,转账,A账户减少,B账户增加。虽然是两条 DML语...
  • c_w_d
  • c_w_d
  • 2017年03月18日 13:55
  • 1711

关于spring框架中的IOC/DI和AOP,以及声明式事务管理的理解

IOC/DI:中文意思控制反转/依赖注入,针对以前编程,类中的属性都是写死的,直接在程序中给成员变量初始化。这样的编程,耦合度太高,代码的灵活性和扩展性太差。spring的处理方式是,在配置文件中,将...
  • woshichuanqihan
  • woshichuanqihan
  • 2016年08月17日 23:50
  • 2183

spring对事务的控制 AOP

我解释一下(* com.evan.crm.service.*.*(..))中几个通配符的含义:  |第一个 * —— 通配 任意返回值类型|  |第二个 * —— 通配 包com.evan.crm...
  • oLeiChang
  • oLeiChang
  • 2016年04月22日 15:24
  • 227

Spring框架运行机制(控制反转,依赖注入,面向切面AOP)

文章属于入门级水平,重要事情说三遍,入门级,入门级,入门级 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion of control 控制反转:由容器控制程序之间的关系,...
  • fei641327936
  • fei641327936
  • 2016年07月24日 17:34
  • 2235

Spring基础、IOC(控制反转)、AOP(面向切面编程)、Log4j、注解配置

1.什么是Spring,有什么作用  --Spring框架属于一个解决方案框架,可以对其他技术和框架进行整合应用。  --*好处是:将程序中的各个组件和框架技术进行解耦,便于日后系统维护,升级和扩展操...
  • daijin888888
  • daijin888888
  • 2016年06月22日 17:29
  • 6022

Spring学习,依赖注入(DI)、控制反转(IoC)和面向切面(AOP)

依赖注入DI和控制反转IoC Spring容器中的依赖注入DI和控制反转IoC xml配置 注解配置 面向切面AOP 面向切面的应用动态代理 Spring容器中的面向切面 xml配置 注解配置 Spr...
  • Nicorui
  • Nicorui
  • 2017年02月13日 15:16
  • 369

spring学习笔记(19)mysql读写分离后端AOP控制实例

在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等。实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些...
  • qwe6112071
  • qwe6112071
  • 2016年03月25日 00:19
  • 1038

切面(aop)控制反转和依赖注入(IOC,DI)和spring的事务隔离和传播行为

实现AOP,主要通过两类方式: 1.采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行; 2.采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译...
  • Senssic
  • Senssic
  • 2013年04月05日 18:10
  • 1029

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享。 需求:service层有一些方法,...
  • adsadadaddadasda
  • adsadadaddadasda
  • 2017年12月26日 15:30
  • 70
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AOP与Spring控制AOP
举报原因:
原因补充:

(最多只允许输入30个字)