AOP是什么?
AOP是什么,能做什么?
AOP是Aspect Orient Programing,面向切面编程(面向方面编程).
AOP能做什么?
考虑如下场景:项目开发出来之后,有一天,客户要求为方法A、B、C……等每个方法,都增加一个日志功能.
比较原始的解决方案: 先定义一个代表日志功能的通用方法,然后依次打开A、B、C……等每个方法,然后增加调用通用方法.
程序员需要手动去修改方法A、方法B、方法C……等每个方法.
过了一段时间,客户又要求为方法A、B、C……等每个方法,都增加一个权限检查的功能,程序员又需要依次修改每个方法
过了一段时间,客户又要求为方法A、B、C……等每个方法……
如果用传统的做法,每次为项目增加一个具有通用性质的横切处理,程序员就需要把所有的方法都修改一遍,因此非常复杂.
此时需要一种技术:
1. 既可为项目中每个方法都增加这种通用性质的横切处理.
2. 不需要程序员去修改任何的代码.
为了达到这个目的,解决方案是:让框架来帮我们修改源代码,如果让框架帮我们为方法A、方法B、方法C……来增加具有
通用性质的横切处理,这种框架就是AOP.
AspectJ(AOP框架)
AspectJ是一个基于Java语言的AOP框架,提供了强大的AOP功能,其他很多AOP框架都借鉴或采纳其中的一些思想.
AOP编程的概念
AOP编程的概念:
Aspect: 切面、方面.
Joinpoint: 连接点.程序执行过程中一个明确的点.
Advice: 增强处理.就是Aop框架在切入点插入(织入)这一段通用处理代码.
切入点Pointcut:可以插入增强处理的连接点.简而言之,当某个连接点满足指定要求时,
该连接点将被添加增强处理,该连接点也就变成了切入点.
引入introduce in:添加方法或field到被处理的类.Spring允许引入新的接口到任何被处理的对象.
例如,你可以使用一个引入,使任何对象实现 IsModified接口,以此来简化缓存.
目标对象target Object:被AOP框架进行增强处理的对象,也被称为被增强的对象.
如果AOP框架是通过运行时代理来实现的,那这个对象将是一个被代理的对象.
AOP代理:AOP框架创建的对象,简单地说,代理就是对目标对象的加强.
Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理,
前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理.
织入Weaving: 将增强处理添加到目标对象中、并创建一个被增强的对象(AOP代理)的过程就是织入.
织入有两种实现方式: 编译时增强(例如AspectJ)和运行时增强(例如CGLIB).
Spring和其他纯Java AOP框架一样,在运行时完成织入.
依赖jar包
aopalliance-1.0.jar
aspectjweaver-1.*.jar
Spring事务
Spring事务:
Spring事务,需要在所有的业务逻辑组件中都需要织入—这就是AOP发挥作用的地方.
Spring的声明式事务就是基于AOP实现,通过AOP的实现,即可将不同业务逻辑组件与不同的事务控制代码分离.
策略模式:
我们要做一件事情,但做这件事情有很种实现算法,目前程序不知道选择哪种算法,或为了兼容以可能新增的算法,此时可考虑策略模式.
我们要做事务控制,不同的持久化技术,对应的事务控制代码是不同的,目前程序不知道选择哪种事务代码,
或以后可能要换其他的事务控制代码.(持久层技术变了,事务控制代码就要跟着变).
策略模式的实现:
1.定义一个策略接口,让我们的程序面向策略接口编程,从而让程序与实现算法分离.
Spring提供了PlatformTransactionManager接口.
2.针对不同的算法,为该接口提供不同的实现类.
DataSourceTransactionManager:针对JDBC技术的事务实现.
HibernateTransactionManager:针对Hibernate技术的事务实现.
JpaTransactionManager:针对Jpa技术的事务实现.
JtaTransactionManager:针对JtaTransactionManager技术的事务实现.
3.需要一个Context类,Context会为程序“智能”选择一个策略实现类.
ApplicationContext。——所谓智能,程序员在beans.xml文件中配置实现类,ApplicationContext选择该实现类.
PlatformTransactionManager事务策略接口
DataSourceTransactionManager针对JDBC技术的事务实现
JtaTransactionManager针对Jta技术的事务实现
HibernateTransactionManager针对Hibernate技术的事务实现
JdoTransactionManager针对Jdo技术的事务实现
JpaTransactionManager针对Jpa技术的事务实现
配置事务管理器
<!-- 配置事务管理器transactionManager --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory"/>
声明式事务
声明式事务,无需程序员写代码,直接配置即可.
依赖jar包
aopalliance-1.0.jar
aspectjweaver-1.*.jar
配置tx命名空间
xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"
aop切面(切业务层)
<!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务--> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- 把事务Advice织入到哪些切入点(AOP事务切面) --> <aop:config> <!-- 定义切入点(切入业务层) --> <aop:pointcut id="interceptorPointCuts" expression="execution(* org.oa.service..*.*(..))" /> <!-- 将事务Advice运用到指定的切入点 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>
声明式事务advice配置
<!-- 声明式事务advice配置 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 配置事务属性 --> <tx:attributes> <!-- set开头的方法,用只读事务(只能做查询) --> <tx:method name="set*" read-only="true"/> <!-- get开头的方法,用只读事务(只能做查询) --> <tx:method name="get*" read-only="true"/> <!-- 剩余的所有方法,有事务可以做CUD [R] propagation(传播性) isolation(隔离性) --> <tx:method name="*" read-only="false" propagation="REQUIRED" isolation="DEFAULT"/> </tx:attributes> </tx:advice>
--------------------------------------------------------------------
<!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice>
事务属性
read-only="true"只读事务
read-only="false"不是只读事务
propagation="REQUIRED"事务传播性
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.(这是最常见的选择)
isolation="DEFAULT"事务隔离性
使用数据库默认的事务隔离级别
rollback-for出现什么异常回滚
no-rollback-for出现什么异常不回滚
配置aop命名空间
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd"
aop事务切面配置
<!-- 把事务Advice织入到哪些切入点(AOP事务切面) --> <aop:config> <!-- 定义切入点(切入业务层) --> <aop:pointcut id="interceptorPointCuts" expression="execution(* org.oa.service..*.*(..))" /> <!-- 将事务Advice运用到指定的切入点 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>
annotation注解
tx:annotation-driven
<!-- 开启annotation注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional()事务注解
// 事务注解 @Transactional(readOnly=false, // 不是只读事务 isolation=Isolation.DEFAULT, // 事务隔离性 propagation=Propagation.REQUIRED) // 事务传播性
写在业务类上这个类中所有方法都起作用
写在业务类的方法上只有这个方法起作用
相关推荐
6. **配置文件**:项目可能包含Web.config或其他配置文件,用于设置AOP框架的选项,如启用或禁用某些特性,或配置日志输出。 为了深入了解这个项目,你需要打开并分析Dzend.MvcTest的源代码,查看类定义、控制器、...
AspectJ是一个完全独立的AOP框架,它可以与Spring框架无缝集成,提供更细粒度的控制和更灵活的切面定义。现在我们来详细探讨这些知识点。 首先,`Spring AOP`是Spring框架的一部分,它允许我们在不修改源代码的情况...
C#实现的AOP框架可以通过动态代理、编译时织入或运行时织入等方式实现。 C#中常见的AOP框架有Unity、Autofac、Castle Windsor等,它们提供了方便的方式来定义和注入切面。例如,Castle Windsor框架利用其动态代理库...
Spring 框架是 Java 开发中的核心工具之一,它为开发者提供了强大的依赖注入(IOC)和面向切面编程(AOP)功能,同时也包含了 MVC 模式来支持 web 应用开发。在这个"手写 spring 框架 ioc+aop+mvc"的项目中,我们将...
本教程将带你深入理解这两个概念,并通过手写一个简易的IoC和AOP框架来加深理解。 **依赖注入(IoC)** 依赖注入是Spring的核心特性之一,它允许开发者将对象的创建和管理权交给框架,从而降低组件之间的耦合度。在...
Spring AOP是Spring框架的一个重要特性,它实现了面向切面编程,允许开发者定义“切面”,即关注点的模块化,比如日志记录、性能监控、安全控制等。切面通过通知(advises)来增强其他对象的行为。Spring支持多种...
这个名为“GreeFramOfficial”的压缩包文件,很可能是提供了一个基于C#实现的IOC和AOP框架,供开发者学习和使用。 IOC(Inversion of Control)的核心思想是将对象的创建和管理交给一个容器来处理,而不是由对象...
在Java中,Spring框架是最著名的AOP实现之一,但这里我们讨论的是一个简易的AOP框架,它可以帮助理解AOP的基本概念和工作原理。 该简易AOP框架包含以下几个关键组件: 1. **配置文件**:这是定义切面(aspect)和...
**仿Spring AOP框架详解** 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱,其中AOP(面向切面编程)是其核心特性之一。AOP允许开发者将关注点从主业务逻辑中分离出来,如日志记录、事务管理等,...
提供了一个快速构建项目的脚手架,简化了配置和部署。 集成了常用的第三方库和框架,减少了开发复杂度。 Spring MVC: 作为系统的Web框架,负责处理HTTP请求和响应。 提供了强大的路由机制和视图解析功能,实现了...
AspectJ是一个强大的AOP框架,它提供了比Spring AOP更全面的AOP支持,包括编译时织入(compile-time weaving)和加载时织入(load-time weaving)。`aspectjrt.jar`包含了AspectJ运行时所需的类和API,使得开发者...
4. **配置和启用AOP**:在Spring配置文件中声明切面,并启用AOP代理。 通过这种方式,`Elasticsearch`可以作为`Mybatis`数据的实时搜索层,提供快速的全文检索能力。`AOP`则作为一个中间层,无缝地将两者连接起来,...
在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...
AOP联盟定义了一套标准接口,包括`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`等,使得Spring AOP和其他AOP框架(如AspectJ)能够共享相同的拦截器实现。...
本教程涵盖了AOP框架的基本概念、Spring AOP的使用以及反射技术的应用,通过学习这些内容,你可以更好地理解和应用AOP框架来提高代码的复用性和可维护性。在实际项目中,结合具体需求,灵活运用AOP框架,可以显著...
Spring 是一个全面的企业级应用框架,它提供了依赖注入(IOC)和面向切面编程(AOP)的核心特性。依赖注入使开发者能够通过配置管理对象之间的关系,而不是硬编码这些关系,从而提高代码的可测试性和可维护性。AOP则...
【today-aop:高性能轻量级AOP框架详解】 在Java开发领域,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程范式,它允许开发者将关注点分离,比如日志、事务管理等,从核心业务逻辑中解耦...
在实践中,Spring AOP是Java开发中最常用的AOP框架之一,它通过注解或XML配置来定义切点和通知。例如,可以使用`@Before`、`@After`、`@Around`等注解来声明通知,而`@Pointcut`注解则用来定义切点表达式。 通过...
**Android-Jet-AOP:一个Android AOP框架详解** Android应用程序的开发过程中,代码的组织和维护是一项重要的任务。为了提高代码的可读性、可维护性和模块化,开发者经常采用设计模式和特定的编程技术。其中,面向...
Spring.NET 是一个开源的 .NET 框架,它提供了依赖注入(DI)和面向切面编程(AOP)的能力。在本篇内容中,我们将深入探讨如何使用配置文件来设置 Spring.NET 的 AOP 功能。 **一、什么是AOP?** 面向切面编程...