对于aop方式我感觉就是一种代理的形式,不改变源代码还能实现新的功能。
aop的实现一个是使用xml方式配置,一个是使用注解的方式。
注解的方式是在xml中先将bean交给spring管理,然后打开注解功能<context:annotation-config/>
然后在切面中加上一个空的方法代替目标对象注解上@pointcut。
然后在代理方法上写@aspec("空方法名()”),@before(point-cut=“”,returning=“”)
也可以直接在xml中写如下代码
<aop:config>
<aop:aspect id="aspect" ref="proxy"><!--代理对象-->
<aop:pointcut expression="* a.b..*.*(..)" id="point"/><!--目标对象的切入点-->
<aop:before method="" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
对于事务管理也是有一些概念的比方说隔离级别,事无属性等
isolation:脏读,幻读,不可重复读、
propagation:required (需要一个事务,没有就打开新的)requirednew(需要一个事务,始终打开新的) support(支持事务) not-support(不支持事务)
never(不要事务,有报错) mandatory(不要事务,没有报错) nested(嵌套调用的时候可以使用别人的事务,没有嵌套的时候跟required一样)
我们可以在代码中加入@transactional实现同一段代码用同一个事务
transactional中也有一些属性(read-only等)
我们也可以在xml中配置事务。
首先引物aop 跟tx命名空间
配置事务之前我们先要使用数据源开启一个事务bean
然后通过aop 的方式把事务注入进来,注入的代码如下:
<aop:config>
<aop:pointcut expression="* a.b..*.*(..)" id="point"/>
<aop:advisor advice-ref="" pointcut="point"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
上述配置的意思是,我们有一个切面,当用户访问到满足* a.b..*.*(..)这个的放大的时候就要到<aop:advisor advice-ref="" pointcut="point"/>中ref方法中去寻找
事务属性,下面的method说明用户如果访问get开头的方法的时候就走这种事务,required default。