aop本质及详解

aop本质剖析

 aop是oop(面向对象编程)的补充与完善,什么是oop呢!oop采用的是单一原则,引入了封装,继承,多态等相关概念。有着从上到下的关系原则!
 通过对象完成我们需要执行的行为操作;也就是我们的业务操作!
 然而,在我们进行业务操作时,或则对象行为操作时,需要为它引入一些公共行为操作如事物,日志,权限等;不可能在每个对象操作类添加这些行为代码!
 这样会造成严重的冗余,以及耦合度,也不便于后期的扩展,维护!
 为了解决这个问题,面向切面技术就产生啦!
 aop面向切面编程也可以叫做面向方面编程!
 aop通常把软件系统分为核心关注点和横切关注点,核心关注点主要是处理的业务逻辑方面,与之关系不大,但却经常发生在他们旁边的叫做横切关注点,如日志,事物等!
 而aop技术把这两个区分开来运行,相关联,而又互不影响!
 核心思想就是把程序中的业务逻辑代码同通用服务分离出来!
 aop怎样实现该思想呢;
 aop采用的代理模式:分为动态代理和静态代理;动态以截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行!而静态采用静态织入的方式,引用特点的语法创建方面,
 从未使得编译器可以在编译期间织入有关方面的代码!
 说白啦就是:动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成而静态代理由程序员创建或工具生成代理类的源码,再编译代理类
 动态代理:jdk的动态代理和cglib动态代理
 jdk的动态代理:在内存中构建出接口的实现类,被代理对象,必须有接口
 cglib动态代理:在内存中生成被代理对象的【子类】,可以在没有接口的情况下代理
 技术实现:
 
 join point(连接点)程序中的一个精确位置,通常是类中的一个方法,aop中不需要去定义一个join point
 
 point cut(切入点)本质上是捕获连接点,在aop中用来捕获需要操作类的相关方法
 
 advice(通知)切入点上的执行代码块!是执行方面的具体操作
 
 aspect(方面)point cut与advice集合起来就是aspect,它代表更多对象间横切的关系
 
 introduce(引入)为对象引用附加的属性及引用,从而达到修改对象的目的

 
 结构图分析:
 


 项目配置解析:
 
 <!-- 配置事务 -->    
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dynamicDataSource"/>
    </bean>
        
      <!--配置哪些数据源需要开启事务  advice通知 rollback-for回滚的异常 method匹配的方法-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
                <tx:method name="batch*"  propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                <tx:method name="save*"   propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                <tx:method name="insert*"   propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                <tx:method name="import*" propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                <tx:method name="add*"    propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                <tx:method name="remove*" propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                <tx:method name="delete*" propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                <tx:method name="update*" propagation="REQUIRED"  isolation="DEFAULT" rollback-for="Exception"/>
                  <tx:method name="find*"  read-only="true" />
                  <tx:method name="get*"  read-only="true" />
                  <tx:method name="select*"  read-only="true" />
                  <tx:method name="login*"  read-only="true" />
       </tx:attributes>
    </tx:advice>

    <!-- 配置哪些类的方法需要进行事务管理 -->
    <aop:config>
       <!-- 切入点对expression里的哪些的类里的相关方法进行匹配并引入advice并执行 这里执行事务操作 如果有多个advice可用order 来选择执行顺序 -->
       <aop:pointcut id="allManagerMethod" expression="execution(* com.dome.service.*.*.*(..))"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" order="1"/>
    </aop:config> 

 
 

猜你喜欢

转载自blog.csdn.net/rainjm/article/details/82183758