OP有三种织入切面的方法:
其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;
其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;
其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。
Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。
基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术,认识这两代理技术,有助于探究Spring AOP的实现机理。只要你愿意,你甚至可以抛开Spring,提供自己的AOP实现。
AOP概念到处都在传,之前以为自己了解了,无非就是应用在日志、事务、权限方面的面向切面编程思想的一种架构或者设计模式罢了,今天在迁移一个项目的时候,发现了AOP的妙处。
实际场景描述,可以说基本每个表结构或者说数据对象都需要createuser,createdate,updateuser,updatedate,创建者,创建时间,修改者,修改时间,如果每次都要自己手动写,在每个dao的add和update方法中复制粘贴,很容易出错,而且工作量比较大的,不能保证完全正确。这个时候我们就可以使用AOP思想,来处理解决该问题。
- package com.xxx.util;
-
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.stereotype.Repository;
-
- import com.xxx.domain.BaseDomain;
-
- @Aspect
- @Repository("maintainAspect")
- public class MaintainAspect {
- final static Logger logger = LoggerFactory
- .getLogger(MaintainAspect .class);
-
-
- @Before("execution(public * com.xxx.dao.impl.*.add*(..)) && args(baseDomain,..)")
- public void appendCreateInfo(BaseDomain baseDomain) throws Exception {
- if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {
- return;
- }
- Session session = ThreadVariable.getSession();
- if (session == null || session.getUserName() == null) {
- logger.error("系统尝试在无登陆的情况下添加[{}]对象", baseDomain.getClass()
- .getName());
- throw new Exception("Session不存在,系统不能正常工作!");
- }
- baseDomain.setCreateDate(session.getAccessTime());
- baseDomain.setCreateUser(session.getUserName());
- }
-
- @Before("execution(public * com.tianque.locationtalk.dao.impl.*.update*(..)) && args(baseDomain,..)")
- public void appendUPdateInfo(BaseDomain baseDomain) throws Exception {
- if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {
- return;
- }
- Session session = ThreadVariable.getSession();
- if (session == null || session.getUserName() == null) {
- logger.error("系统尝试在无登陆的情况下更新[{}]对象,对象ID为[{}]", baseDomain
- .getClass().getName(), baseDomain.getId());
- throw new Exception("Session不存在,系统不能正常工作!");
- }
- baseDomain.setUpdateDate(session.getAccessTime());
- baseDomain.setUpdateUser(session.getUserName());
- }
-
- }
配置环境方面不需要任何更改,也不需要影响之前任何代码,即可实现对相关的数据对象自动添加createuser,createdate,updateuser,updatedate。
AOP非常good,这种没有侵害的改造让人非常赏心悦目。很多时候都是人云亦云,以为AOP只能处理事务、日志等东西,实际上AOP远不止的,我们可以让我们的代码变得更加有质量的。
分享到:
相关推荐
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、...通过实践这些示例,可以更好地理解Spring AOP的精髓,从而在实际项目中灵活运用。
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...
在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过...这个例子提供了学习Spring AOP实际操作的宝贵资源,通过阅读源码和运行测试,你将对Spring AOP有更全面的认识。
本实例将深入探讨Spring AOP的使用,包括基本概念、配置以及如何在实际项目中应用。 **一、Spring AOP基础知识** 1. **切面(Aspect)**:切面是跨越多个对象的行为或关注点的模块化。在Spring AOP中,切面由通知...
总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
Spring AOP,全称Aspect-...总之,通过学习这个实例,你将能够掌握Spring AOP的基本使用,包括创建切面、定义通知、设置切入点,以及如何在实际项目中配置和应用这些概念。这将有助于你构建更加模块化、可维护的系统。
通过分析这个测试案例,你可以了解如何在实际项目中实现AOP。例如,它可能包含了一个带有切面逻辑的切面类,使用了`@Before`注解的方法会在目标方法执行前运行,而使用`@After`注解的方法则会在目标方法执行后运行。...
在这个入门实例中,我们将深入理解Spring AOP如何实现简单日志记录。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是AOP中的核心...
在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...
在这个"SpringAop实例"中,可能包含了演示如何创建和使用这两种配置方式的代码示例。文件列表中的"spring32"可能是指Spring 3.2版本的相关文件,这个版本的Spring对AOP的支持已经相当成熟。 通过学习这个实例,你...
在实际项目中,Spring AOP 和 Spring IOC 的结合使用能带来强大的功能和可维护性。例如,你可以使用 AOP 实现全局的事务管理,而 IOC 负责管理事务管理器和其他业务对象的生命周期。在提供的 `lib` 压缩包中,应包含...
在这个经典例子中,我们将深入理解Spring AOP的核心概念,并通过实际操作来加深印象。 首先,AOP的核心是切面(Aspect),它封装了横切关注点,如日志记录、事务管理等。在Spring AOP中,切面通常由一个或多个通知...
在IT行业中,Spring框架是Java企业级应用开发的首选,而...在上述实例中,我们学习了如何定义切面、创建通知以及配置切入点,这些都是Spring AOP的基础。通过深入理解和实践,我们可以构建出更加健壮和易于维护的系统。
1. **启用 AspectJ 注解支持**:为了在 Spring 应用中使用 AspectJ 注解,需要确保项目 classpath 下包含了必要的 AspectJ 类库,包括 `aopalliance.jar`、`aspectjweaver.jar` 等。 2. **配置 AspectJ 切面**:...
在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱,而Spring AOP(面向切面编程)则是Spring框架中的一个重要...通过理解和实践这个实例,开发者可以更好地掌握Spring AOP,并在实际项目中灵活运用。
**Spring AOP配置实例** ...当然,实际的项目中可能会有更复杂的切面逻辑和通知类型,但这个实例提供了一个很好的起点。你可以根据需要扩展和调整切点表达式,以及定义更多的通知类型,以满足更丰富的业务需求。
Spring AOP(面向切面编程)是一个强大的工具,常用于实现业务逻辑中的横切关注点,如日志、事务管理以及我们的案例——数据权限控制。本篇将深入探讨如何结合Spring AOP和Oracle数据库来实现精细化的数据权限控制。...