默认的情况下,Aspect类只有一个实例存在于虚拟机中,也就是作为单例存在的,对于每个对象来说,方面是共享的。一般这样的方面,不能用来保存相应对象的状态。
对于AspectJ 来说,Aspect方面类,包括以下的实例化方式。
* 每虚拟机(默认),只有一个实例,其生命周期从虚拟机启动开始,一直到虚拟机停止。
* 每对象,对于每一个对象都有一个方面实例,其生命周期跟随相关联的对象。
* 每控制流,对于每个controlFlow点,都会创建相应的方面实例,可以参考事务管理(对于事务,每个原子操作,都是一个控制流,方面的生命周期,从控制流开始,一直到控制流结束)。
1) 每虚拟机关联
默认方面,它的状态是共享的。
2)每对象关联
通常,重用基础方面需要保持每个对象的状态,也就是对象的数据。对于每个对象都会创建一个方面实例。
对于每对象关联可以指定两种类型:
perthis()-与当前所匹配的连接点的执行对象,所关联
pertarget()—与当前所匹配的连接点的目标执行对象,所关联
3)每控制流关联
可以指定两种类型的每控制流对象关联:
percflow()-对于在percflow()指定的pointcut所匹配的连接点,关联每一个独立的方面实例和控制流执行。
percflowbelow(),对于在prcflowbelow ()指定的pointcut所匹配的连接点,关联每一个独立的方面实例和控制流下的执行。
下面来看一个实例:来区别不同点:
声明必要的测试类
public class TestBean {
private String name;
public TestBean(String name) {
this.name = name;
}
public void method1() {
}
public void method2() {
}
@Override
public String toString() {
return name;
}
}
测试类:
public class LogAspectTest {
@Test
public void testAssociation() {
TestBean bean1 = new TestBean("bean1");
TestBean bean2 = new TestBean("bean2");
bean1.method1();
bean1.method2();
bean2.method1();
bean2.method2();
}
}
方面类:
public aspect LogAspect {
private static Log log = LogFactory.getLog(LogAspect.class);
public LogAspect() {
log.info("create LogAspect instance");
}
pointcut logMethod(TestBean bean)
:execution(* TestBean.method*(..))&&this(bean)&&!within(LogAspect+);
before(TestBean bean):logMethod( bean){
log.info("JoinPoint: "
+ thisJoinPointStaticPart
+ "\n\taspect: "
+ this
+ "\n\tobject: "
+ bean);
}
}
默认的输出为:
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
aspect: demo.chap4.log.LogAspect@15601ea
object: bean1
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
aspect: demo.chap4.log.LogAspect@15601ea
object: bean1
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
aspect: demo.chap4.log.LogAspect@15601ea
object: bean2
2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
aspect: demo.chap4.log.LogAspect@15601ea
object: bean2
可以看到只是实例化了一次
现在更改相应的aspect,
public aspect LogAspect perthis(logMethod(TestBean)){
....
}
}
只是增加了perthis(logMethod(TestBean))
输出时,可以看到创建了两个实例
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
aspect: demo.chap4.log.LogAspect@197d257
object: bean1
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
aspect: demo.chap4.log.LogAspect@197d257
object: bean1
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
aspect: demo.chap4.log.LogAspect@7259da
object: bean2
2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
aspect: demo.chap4.log.LogAspect@7259da
object: bean2
继续更改aspect,把perthis改为percflow
输出改为:
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
aspect: demo.chap4.log.LogAspect@eee36c
object: bean1
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
aspect: demo.chap4.log.LogAspect@194df86
object: bean1
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())
aspect: demo.chap4.log.LogAspect@defa1a
object: bean2
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance
2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())
aspect: demo.chap4.log.LogAspect@f5da06
object: bean2
每个方法都创建相应的实例。
|
相关推荐
### 牛人的Spring学习笔记,非常适合初学者 #### 第一课:面向抽象编程 面向抽象编程是一种编程思想,强调在程序设计过程中通过定义抽象层来分离业务逻辑与具体实现细节。这种方式有助于提高软件的可维护性和扩展...
### Spring2.5 学习笔记关键知识点梳理 #### 搭建Spring的运行环境 - **新建项目**: 使用IDE工具如Eclipse或IntelliJ IDEA创建一个新的Java Web项目。 - **Spring配置文件**: 在项目的`src/main/resources`目录下...
### Spring学习笔记知识点详解 #### 一、Spring学习模块概览 Spring框架作为一个全面而强大的企业级应用开发框架,其内部包含多个模块,这些模块分别针对不同的应用场景和技术领域进行了优化设计。了解这些模块有...
### Spring2.5 学习笔记详解 #### 一、Spring 框架简介 Spring 是一个开源的轻量级 Java 开发框架,主要用于简化企业级应用的开发工作。Spring 提供了一系列强大的功能,比如控制反转 (Inversion of Control, IOC)...
- **3.4 Bean的作用域**:Bean可以有多种作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,理解不同作用域对对象生命周期的影响至关重要。 ### 3. **AOP(Aspect-Oriented ...
### Spring2.5 学习笔记知识点概览 #### 第一课:面向抽象编程 - **概念理解**:面向抽象编程是一种设计模式,其核心思想是通过定义接口或抽象类来实现程序结构的设计,使具体实现与接口分离,增强系统的灵活性和...
- **Bean的生命周期**:Spring管理的Bean有完整的生命周期,包括初始化、使用和销毁,可以自定义生命周期回调方法。 总结,Spring框架通过IOC和DI实现了对象的解耦和灵活管理,提供了AOP进行横切关注点的处理,...
### Spring2.5.6 学习笔记精粹解析 #### 一、Spring框架环境搭建与JAR包配置 在开始深入Spring框架的学习之前,首先需要确保开发环境正确配置Spring框架。按照“传智播客Spring2.5.6学习笔记最新整理”的指引,...
### Spring框架案例学习文档笔记知识点总结 #### 面向抽象编程 - **定义**:面向抽象编程是一种软件设计原则,旨在通过抽象层隔离具体实现细节。这种方式有助于提高代码的可维护性和灵活性。 - **实践**:在Spring...
在"截图"中,可能会展示如何定义和使用AspectJ切面,以及如何使用@Aspect和@Pointcut注解。 接下来,我们讨论Spring Bean的生命周期。Bean在Spring容器中有其特定的生命周期,包括初始化、正常使用和销毁。开发者...
Bean模块负责管理Bean的生命周期;Context模块构建于核心模块之上,提供了更多的高级功能;表达式语言模块则提供了查询和管理运行时对象的强大能力。 #### 四、Spring 3.0的新功能 Spring 3.0版本于2009年12月发布...
BeanFactory 是 Spring 容器的基础,负责管理对象的生命周期和依赖关系。ApplicationContext 建立在 BeanFactory 之上,增加了国际化支持、资源加载等功能,是日常开发中最常用的上下文接口。WebApplicationContext ...
Spring 主要提供了一个灵活的平台,用于管理对象的生命周期和依赖关系,实现了控制反转(IoC)和面向切面编程(AOP),使得开发者能够更加关注业务逻辑,而不是基础设施层的细节。 1.2 Spring 框架的优点 - 易于...