AOP
AOP也叫做面向切面编程。是OOP的一个补充。
OOP:Object Oriented Programming 面向对象编程,
该技术使用了封装,继承,多态,抽象来建立的一个对象层。
AOP作用:在不改变原来代码的前提下,给源代码插入新的执行代码( 日志,事务,权限,缓存
处理等)。
AOP底层原理小分析:
AOP底层基于代理机制来实现功能扩展。
代理模式:
静态代理:
在代码编译期时,代理类已经存在。
好处:可以让我们只关心核心代码。
坏处:多个代理类,没有解决代码冗余问题。
动态代理:
在代码编译期时,代理类不存在。
运行时,动态的创建出来代理对象。
好处:解决代码冗余问题,类与类之间的依赖。
代理类:B实现A接口,C实现A接口,C调用B的方法,C就是代理类。
AOP底层通过字节码技术,把目标对象以及额外功能动态封装,生成代理
对象 ( 动态代理 ), AOP 使用了 JDK 动态代理 以及 cglib 动态代理
JDK生成动态代理对象:
使用反射机制,方法和对象都是传入的变量,就可以经过传入的对象和方法,
从而调用 JDK中提供的动态代理API(newProxyInstance()方法),生成代理对象,
被代理的类必须实现接口。
AOP标签小结
把方法和增强处理编织在一起
<bean class="增强类的类全路径" id="advice" />
让Spring知道哪些方法需要使用增强处理
<aop:config>
<aop:pointcut expression="execution(返回值 类全路径.类名.方法(参数,可以多个))" id="MyMethod" />
<aop:advisor advice-ref="advice(配置好的增强功能类)" pointcut-ref="MyMethod(aop:pointcut配置好的目标类的id)">
</aop:config>
如果是更新数据操作的方法,这些方法需要事务处理
声明事务管理器
<bean id="transactionMannger" class="org.springframework.jdbc.datasource.DataSourceTransactionMannger">
<property name="dataSource" ref="dataSource数据源" />
</bean>
声明事务增强<tx ... />
<tx:advice id="txAdvice" transaction-mannger="transactionMannger事务管理器">
定义事务规则 表示get/set方法开头的方法不需要事务处理
<tx:method name="get*" read-only="true" />
<tx:method name="set*" read-only="true" />
表示除了get/set开头的方法,都需要事务处理
<tx:method name="*" propagation="REQUIRED" />
</tx:advice>
定义切入点,把让事务处理和方法编织在一起
<aop:config>
<aop:pointcut expression="execution(返回值 类全路径.类名.方法(参数,可以多个))" id="Im">
<aop:advice advice-ref="txAdvice事务增强" pointcut="Im(aop:pointcut配置好的目标类的id)">
</aop:config>
tx事务管理属性详细请看http://note.youdao.com/noteshare?id=3e7560680fd456aee906f6b5c3f3c2ad&sub=E32AD99AF86B46DDA5A3C4B7CF1A0AED