Spring AOP原理浅析及入门实例

上篇问题及Spring AOP实现原理浅析

上篇说了一个AOP编程问题,那是一个错误的AOP案例。它的错误在A类中,再次粘贴A类代码:

    @Componentpublic class AImpl implements A{public void doing() {System.out.println("hello");}public static void main( String[] args ){ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");AImpl a=ctx.getBean(AImpl.class);      //(1)出错行//A a=ctx.getBean(A.class);            //(2)换成这样就正确了a.doing();}}

先说一下正确代码(代码2)的执行过程:

步骤执行过程
1程序启动,生成Bean并加载到缓存池(因为Spring默认是即时加载bean,而不是延时加载),因为配置了切面,所以,不生成AImpl类的bean,而生成一个proxy类对象。这个proxy类实现了A接口,并通过反射机制来调用AIplm类对象来完成操作。(这其实就是动态代理模式
2得到beanFactory。
3根据A的名以单例模式获取bean实例,发现容器中只有proxy对象是A类对象,所以实际返回的是proxy对象
4执行proxy对象的doing()方法.

为什么行(1)错了呢?
因为,容器中并没有AImpl类的bean实例,而只有proxy类的实例。所以,ctx.getBean(AImpl.class) 返回的是null。

Spring AOP是默认是通过动态代理的方式来实现的,动态代理要求代理对象和被代理对象必须要有同一个接口。如果类一个接口都没有实现,那么,Spring将使用CGLIB方式实现,CGLIB方式不要求类实现接口。
上面的示例中,Aimpl实现了A接口,所以使用的是动态代理方式,如果Aimpl不实现A接口,则将会使用GCLIB方式,那么行(1)也是正确的。

入门实例

1.加入依赖包,建议使用maven的方式。修改pom..xml文件,加入下面的依赖。

<!-- spring framework -->    <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.1.RELEASE</version></dependency><!-- AspectJ依賴包 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.6</version></dependency><dependency><groupId>aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.5.3</version></dependency>

2.bean.xml文件,就加入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"><!--自动扫描包中的bean,使用注解来配置bean就需要这一行,需要修改包名--><context:component-scan base-package="com.lcl.springlearning"></context:component-scan><!-- 添加对 aspectj支持 --><aop:aspectj-autoproxy></aop:aspectj-autoproxy>  
</beans>

3.编写正常的逻辑代码。一个接口A,和一个实现类AImpl。Spring AOP的动态代理机制要求被切面拦截的类必须实现一个接口。
接口:

public interface A {public void doing();
}

实现:

@Component
public class AImpl implements A
{public void doing() {System.out.println("hello");}
}

4.定义切面。注意这个切面必须定义成一个bean,也就是要加。上@Component 注解

@Aspect    //定义一个切面
@Component
public class B {@Pointcut("execution(* doing(..))")   //定义一个切点,拦截所有的doing方法public void pointCutMethod(){}@Before("pointCutMethod()")       //定义前置事件public void doBefore(){System.out.println("前置通知!");}@After("pointCutMethod()")        //定义最终事件public void doAfter(){System.out.println("后置通知!");}
}

5、测试代码

public static void main( String[] args ){ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");A a=ctx.getBean(A.class);//注意要使用接口Aa.doing();}

刚开始学的时候,看了很多实例都讲了太多现实逻辑,非常难懂,强烈要求讲例子的时候不要加入太多现实逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AE CreateFeatureClass 创建shp. 删除shp. 向shp中添加要素

/// <summary>/// 创建多边形shp/// </summary>/// <param name"pPolygon"></param>/// <param name"shpPath"></param>public static void CreatePolygonFeatureClass(IPolygon pPolygon, string shpfolder,string …

aes密文长度_RSA加密密文可变(一句话说明)

先来看一个搜索结果&#xff1a;RSA算法本质上是基于数学【对极大整数做因数分解的难度】的原理&#xff0c;so 密文本质上是一堆有规则的数字经过编码和【填充】的结果。原文和加密密钥相同&#xff0c;在java环境&#xff0c;默认Padding模式下每次生成的密文是相同的&#x…

网络分析之networkx(转载)

图的类型 Graph类是无向图的基类&#xff0c;无向图能有自己的属性或参数&#xff0c;不包含重边&#xff0c;允许有回路&#xff0c;节点可以是任何hash的python对象&#xff0c;节点和边可以保存key/value属性对。该类的构造函数为Graph(dataNone&#xff0c;**attr)&#xf…

ubuntu 14 java web服务器搭建

前言 前段时间&#xff0c;在阿里云买了台云服务器&#xff0c;30多块&#xff0c;然后部署了一个tomcatmysqlredissvn的运行环境&#xff0c;下面是一些整理。 连接到远程服务器 使用ssh登陆工具&#xff0c;比如scure CRT&#xff0c;以下的命令都是指在scure CRT下输入 …

sqlite管理工具_Liquibase 数据库版本管理工具:1.安装

1.Liquibase 是什么粘一段官方的解释Track, version, and deploy database changes跟踪、管理和应用数据库变化说白了&#xff0c;就是一个将你的数据库脚本转化为xml格式保存起来。其中包含了你对数据库的改变&#xff0c;以及数据库的版本信息&#xff0c;方便数据的升级和回…

BZOJ2720: [Violet 5]列队春游

2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 173 Solved: 125[Submit][Status][Discuss]Description Input Output Sample Input Sample Output HINT 题解&#xff1a;对于这种题目我只能呵呵一笑欺负我是单身汪&#xff0c;哎&#xff01; 一、…

win7下卸载linux系统(不用windows光盘)

前言 安装win7Linux双系统后&#xff0c;不想用了&#xff0c;该怎么卸载呢&#xff1f;其实&#xff0c;只要删除Linux分区即可删除掉Linux&#xff0c;但是&#xff0c;为了防止启动进不了windows&#xff0c;还是要更新一下主引导记录。 步骤一&#xff1a;使用MbrFix工具…

python 文本处理库_推荐8种目前Python使用率最高的文本处理工具

前言 文本处理一般包括词性标注&#xff0c;句法分析&#xff0c;关键词提取&#xff0c;文本分类&#xff0c;情感分析等等&#xff0c;这是针对中 文的&#xff0c;如果是对于英文来说&#xff0c;只需要基本的tokenize。本文为大家提供了以下这些工具包。我整理了Python的相…

面向对象(二)——三大特性(封装、继承、多态)

一、封装 目的&#xff1a;保护类&#xff0c;让类更加安全。 做法&#xff1a;让类里面的成员变量变为私有&#xff08;即访问修饰符&#xff09;的&#xff0c;做相应的方法或者属性去间接的操作成员变量 ※访问修饰符 private 私有的 只能在该类中访问 protec…

利用伸展树提高区间操作的性能

一、首先&#xff0c;什么是区间操作&#xff1f;以及各种数据结构性能对比 区间操作就是对一个序列的某个区间的所有元素进行的操作。比如&#xff0c;对区间所有元素增加一个值&#xff0c;翻转区间元素等。 对区间操作&#xff0c;最普通的方法就是数组。比如&#xff1a;…

python书写风格_以下两种风格 Python 写法,请问大家倾向哪种:)

看到不同的同事代码&#xff0c;表达同一个意思&#xff0c;主要 if 部分以下哪种写法比较好些&#xff1a;&#xff09; 第一种写法 def xxxx(ph, sin_id): """ """ with OracleConnect(xxxx) as db_oracle: sql u"xxxxx" has_data,…

中科大开源镜像使用帮助列表

https://lug.ustc.edu.cn/wiki/mirrors/help转载于:https://www.cnblogs.com/hikecn/p/5797959.html

伸展树的代码实现

一、伸展树的数据结构 typedef struct Node {int key; struct Node *lch,*rch,*parent; }* Node ,* Tree; 二、伸展树的基础操作 下面几个函数中&#xff0c;设x 的父节点为 p, p的父节点为g 。 zig( t , x ) 右旋。当p是根节点&#xff0c;x是p的左孩子&#xff0c;将…

枚举命名规范_UE4 C++基础教程 - 编码规范

为什么要学习编码规范&#xff1f;良好的编码规范不仅利于项目维护&#xff0c;也增加了代码辨识度。使我们在阅读代码时能够更加清晰的理解代码意图。维护编码规范不是一件机械化的工作&#xff0c;它更像是一门艺术&#xff0c;让我们在有限的规范内发挥自己的创造力。除此之…

Cocos2d-x之Log输出机制

| 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 在cocos2d-x中&#xff0c;我们使用log这个函数进行输出&#xff0c;log可以输出很多参数&#xff0c;它的使用方式就和使用c语言中的printf的使用方式差不多。log其实是一个跨平台的日志输出的…

最佳单例模式

initialization on demand holder 模式分析 单例模式要求在应用运行的过程中&#xff0c;只有一个类的实例存在。因此&#xff0c;要确保创建过程是线程安全的&#xff0c;同时要兼顾性能。目前了解到做得比较好的&#xff0c;就是这种initialization on demand holder模式&am…

python接口测试jason_Python 接口测试之Json数据文件操作

引言 前面说过接口测试就是数据的测试&#xff0c;在测试之前&#xff0c;需要准备好测试数据&#xff0c;而测试数据可以用数据库、excel、txt和csv方式&#xff0c;当然还有一种方式&#xff0c;那就是使用json文件来储存测试数据。常用的方式就是这些。 设计思路 python读取…

城市轮廓线求解

问题描述 每一个建筑物用一个三元组表示(L, H, R), 表示左边界, 高度和右边界,轮廓线用X,Y,X,Y…这样的交替式表示,给N个建筑&#xff0c;求轮廓线。 总体思路 首先&#xff0c;要将建筑物离散成点或线&#xff0c;方便运算。将建筑物表示成&#xff08;L,H&#xff09;,(R,…

wpf的listbox循环数据滚动_滚动版 CentOS Stream 和 Fedora 的关系

如果 CentOS 现在位于 RHEL 的上游&#xff0c;那么 Fedora 会发生什么&#xff1f;那不是 Fedora 在 Red Hat 生态系统中的角色吗&#xff1f;-- Matthew Miller&#xff08;作者&#xff09;一封来自 Fedora 项目负责人办公室的信件&#xff1a;&#xff08;LCTT 译注&#x…

位运算的妙用

位运算所有语言里面都有位运算&#xff0c;&&#xff0c;|,^,~,<<,>>,>>>&#xff0c;但是其他语言不清楚&#xff0c;前端估计许多人直接一扫而过&#xff0c;甚至把这玩意和逻辑或与混淆&#xff0c;甚至有的不认识<<,>>>,问这什么意…