默认的情况下,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

每个方法都创建相应的实例。

AspectJ 学习笔记:Aspect的生命周期相关推荐

  1. 【前端学习】React学习笔记-事件、生命周期、虚拟DOMdiffing

    跟着尚硅谷的天禹老师学习React 看视频可以直接点击 b站视频地址 React中的事件处理 补充ref 上面的ref在React官网中提到不要被过度使用,在一些情况下可以使用其他方法来获取数据,比如 ...

  2. Web前端学习笔记:Vue生命周期理解

    一.感谢原创博主 示例代码出处====vue2.0 探索之路--生命周期和钩子函数的一些理解 官方文档 二.生命周期简单描述 总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后. 创建前/ ...

  3. Spring.NET学习笔记(5)-对象生命周期和创建者对象

    一.对象生命周期 说白了就是一init初始化方法和Dispose方法 两种实现方式 1.实现接口方法(造成耦合,放弃),IInitializingObject / init-method和IDispo ...

  4. Spring学习笔记八--Bean生命周期和后置处理器

    为什么80%的码农都做不了架构师?>>>    Bean生命周期和后置处理器 IOC容器的bean生命周期 1.构造器或工厂方法建立bean实例 2.bean属性赋值,引用其他bea ...

  5. 少侠请重新来过 - Vue学习笔记(二) - Vue生命周期

    Vue 生命周期和钩子 每一个vue实例创建时,会经历一段初始化的过程,同时会调用其生命周期钩子,实例的钩子this指向它的Vue实例,不需要在钩子用箭头函数. <template>< ...

  6. iOS初级开发学习笔记:APP生命周期的学习总结

    我们平常使用APP时,一般人都会知道有:简单的正在使用状态:通过home键等方式离开应用,但是不关闭应用,即后台状态:以及调出后台程序管理后向上滑动将应用"杀死",三种状态.而我们 ...

  7. 传播智客学习笔记--L27 Activity生命周期

    将Activity设置为对话框样式 生命周期示意图 Activity 四种启动模式 转载于:https://www.cnblogs.com/lya-nju/p/4231026.html

  8. Java Web 学习笔记3 Servlet生命周期

    https://www.bilibili.com/video/av31486135/?spm_id_from=333.788.videocard.0 环境:Eclipse 2019-06 (4.12. ...

  9. Android学习之碎片的生命周期

    一.碎片的状态: 1.运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态. 2.暂停状态:当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它 ...

  10. 微信小程序学习6:页面生命周期回调函数

    微信小程序学习6:页面生命周期回调函数 文章目录 微信小程序学习6:页面生命周期回调函数 1 生命周期图像 2 生命周期回调函数触发条件 onLoad(Object query) onShow() o ...

最新文章

  1. Maven和Gradle对比
  2. java中最容易犯错的特殊字符
  3. 数据采集与分析的那些事——从数据埋点到AB测试
  4. 软文:第三方支付技术的场景应用,支付技术延伸与国际化
  5. as3分页——页数多了后自动居中类似谷歌分页
  6. 再也不用担心面试官问你HashCode和equals了
  7. echars水状_Echarts饼状图属性设置
  8. 58端口使用技巧跟推送_Kindle使用技巧:定时推送
  9. 【发现问题】IDEA设置全局新创建文件默认换行符
  10. 最强Java面试题全部合集,涵盖BAT大厂面试必考的9大技术!-强烈建议收藏
  11. 阿里云实时数仓Hologres年度发布,解读数仓新趋势
  12. 五大科技巨头公司 是如何赚取数十亿美元的
  13. PyTorch:tensor-数据处理
  14. 【adb命令】电脑操作手机adb命令大全
  15. windows日志文件查看与清理
  16. 高盛:79页区块链报告-《从理论到实践》(附下载)
  17. 线性回归、逻辑回归学习笔记
  18. 当你电脑网络显示正常,但是网页却无法上网时,你应该..
  19. 苏黎世联邦理工学院计算机系研究生,大神offer | 恭喜四位再来人学员斩获苏黎世联邦理工学院-电子工程与信息技术硕士 !...
  20. 敏捷迭代管理 --需求讲解会

热门文章

  1. 未来十年万亿美元的云“风口”,亚马逊云科技再次加速“起飞”
  2. 六、 MySQL函数
  3. 用汇编写的计算阶乘N!的程序
  4. 计算机的规格介绍英语,电脑常见的一些英文(主板名称型号英文缩写)
  5. .NET CoreWebApi基于EasyNetQ使用RabbitMQ消息队列
  6. 10. Arm的TrustZone, CryptoCell, 以及Cryptoisland到底什么关系?
  7. 前端:运用js和jquery实现风琴图
  8. 数据库课程总结(ORACLE)
  9. 【专升本计算机】2021年甘肃省专升本计算机全真模拟试题(一)
  10. 拓扑排序(依次加入入度为0的节点)