AspectJ教学
这几天看JAVA基础看的有点头疼,决定时不时的换换口味,准备開始调研一些如今流行的技术,于是,開始埋头思考自己知识的盲区(当时,自己的知识盲区茫茫多...),想了几天后,决定要開始研究一下几种技术及实现原理。
1、AOP技术应用及实现原理。
2、quartz调度的DB持久模式及集群模式的实现及原理。
3、Mysql分库分表的方法。
4、JFinal框架的学习。
眼下先暂定这个日常把,毕竟想搞定一块以我的水平来看,都得一周时间。
那么今儿我们就先来谈一谈AspectJ的实现吧,类似这种文章在CSDN茫茫多,我为什么写这篇文章呢,由于我发现一提到AOP都是各路神仙開始讲SpringAOP与AspectJ的差别,要么就是SpringAOP的实现原理,感觉市面上缺少小白级别的文章,恰逢鄙人不才~SpringAOP的源代码看着没啥灵感,也就仅仅能写写这种教学文章了。
以下正式開始!
1、首先是Maven配置,以下是须要引的包:
<span style="font-family:Microsoft YaHei;font-size:14px;"> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!--springr容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--AspectJ包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
<!--通过SpringJUnit4ClassRunner注解測试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.1.0.RELEASE</version>
<scope>test</scope>
</dependency></span>
整个project我採用了spring的框架结构,版本为3.2.0.RELEASE。
Junit我用了4.1版本号,为了方便測试的时候不用再编写一连串的代码来读取spring容器。
2、以下看配置文件:
<span style="font-family:Microsoft YaHei;font-size:14px;"> <!--启动AspectJ注解模式-->
<aop:aspectj-autoproxy/>
<!--spring容器扫描包路径-->
<context:component-scan base-package="com.test"/></span>
就两行~注解都解释的非常清楚了。
3、定义切面类
<span style="font-family:Microsoft YaHei;font-size:14px;">import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Service; /**
* Created with IntelliJ IDEA.
* User: 菜鸟大明
* Date: 14-7-11
* Time: 上午10:03
* To change this template use File | Settings | File Templates.
*/
@Service
@Aspect
public class AspectBean { /** 必须为final String类型的,注解里要使用的变量仅仅能是静态常量类型的 */
final static String expression = "execution(* com.test.*..*.*(..))"; // 第一种方式,定义Pointcut标签
@Pointcut("execution(* com.test.*..*.*(..))")
private void pointCutMethod() {
}
// Before里传入@Pointcut所注解的方法
@Before("pointCutMethod()")
public void before() {
System.out.println("before");
} @After(expression)
public void after() {
System.out.println("after");
}
// 另外一种方式,直接传入运行表达式
@Around(expression)
public void around(ProceedingJoinPoint joinPoint) {
System.out.println("around before");
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("around after");
} }
</span>
这里我略微说具体一点,那么@Service我就一句带过了,就是注入容器,否则的话,你须要在spring-config.xml里定义这个bean。
@Aspect就是定义这个类为切面,这块事实上挺不好理解的,假设理解不上去,就把@Aspect的注解类,当成是AOP横切的母体。
@Before就是在这个类执行前执行。
@After就是在这个类执行后执行。
@Around这个事实上跟Struts2里的拦截器功能是一样的,内部的实现也是类似。这样的模式更灵活,也是我们平时运用最多的方式。但要记得这但是代理模式,假设想用反射操作业务类的话,你取到的但是代理。
4、业务类
<span style="font-family:Microsoft YaHei;font-size:14px;">@Service
public class Cat {
public void run () {
System.out.println("在跑");
}
}
</span>
5、測试类
<span style="font-family:Microsoft YaHei;font-size:14px;">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:spring-config.xml" })
public class SpringAOPTest1 {
@Resource
Cat cat;
@Test
public void run() {
cat.run();
}
}</span>
文章开头我说过,引入Junit 4.1以上的版本号的目的就是为了省略那一长串读取容器的写法。
省略了ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
6、输出结果:
around before
before
在跑
around after
after
我们不用关心是Around 和 Before After的运行顺序,由于在正常的情况下,Around 与 Before、After非常少在一起使用的。
总结:AspectJ给我的感觉比SpringAOP写法更方便,不须要在xml里嵌入过多的代码。但有一个问题,实际项目中,使用这样的POJO注解方式可能会给我们带来“幽灵拦截器”。我们细致观察发现,要实现这个AOP功能,我们不须要嵌入不论什么业务代码、业务上下文中,在自己的地盘儿写好代码,但这会造成什么问题呢?
假设我们项目的管理文件夹没有做好,@AspectJ类到处飘,我们非常难推断究竟有多少拦截器在对“包装”我们的逻辑,要想查找这些拦截器,仅仅能全文搜索“@Aspect”再一个个去检查。因此,想正确的使用AspectJ,不仅要做好代码管理,还要写好凝视,这样才干方便别人来维护这些代码。
在spring AOP中我们相同也能够使用类似AspectJ的注解来实现AOP功能,可是这里要注意一下,使AspectJ的注解时,AOP的实现方式还是Spring AOP。
下次我会带来SpringAOP的简单实现,下下次应该会做原理的分析,只是假设自己感觉吃力,就会考虑转载一篇高手的解读~
AspectJ教学的更多相关文章
- 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单
不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...
- Yeoman 官网教学案例:使用 Yeoman 构建 WebApp
STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- Linux实战教学笔记07:Linux系统目录结构介绍
第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...
- Linux实战教学笔记06:Linux系统基础优化
第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...
- Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)
第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...
- Linux实战教学笔记04:Linux命令基础
第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...
- Linux实战教学笔记03:操作系统发展历程及系统版本选择
标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...
- Linux实战教学笔记02:计算机系统硬件核心知识
标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 互联网企业常见服务器介绍 1.1 互联网公司服务器品牌 - DELL(大多数公司,常用) - HP - IBM(百度在用) 浪潮 联想 航天联 ...
随机推荐
- PHP Database ODBC 之 ODBC
ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库). 创建 ODBC ...
- Spring定时任务的几种实现(转自iteye网gong1208)
原文地址: http://gong1208.iteye.com/blog/1773177 以下为正文: 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整 ...
- 牵一发动全身【Nhibernate基本映射】
用牵一发动全身来形容Nhibernate的映射,一点都不夸张.小小的属性的修改,决定了整个Nhibernate的执行动态.以下让我们来详细了解一下,通过回想我们在上篇文章中用到的配置文件,做一个对xm ...
- Java中对象的三种状态
Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可达状态. 状态二:可复活态:从根节点开 ...
- Sybase配置数据库参数
Sybase配置数据库参数参数配置的两种方法:sp_configure ‘参数名称’,参数值修改参数文件(如:Sybase主机上的 %SYBASE%\servername.cfg) 配置Sybase数 ...
- HTML中的figure与figcaption标签
本来想分两篇文章来解释说明figure.figcaption的,但是这俩个标签都是定义图文的,所以我们合起来讲解,大家更能容易接受. 大家在写xhtml.html中常常用到一种图片列表,图片+标题或者 ...
- mysql操作SQL语句
二.数据库操作SQL语句1.显示服务器上当前存在什么数据库SHOW DATABASES; 2.创建名称为rewin的数据库CREATE DATABASE rewin; 3.删除名称为rewin的数据库 ...
- java 时间格式化(2016.04.12 12:32:55)
输入的时间格式如:2016.04.12 12:32:55所示: 想要获取一定格式的日期,时间的方法 String startString = "2016.04.25 12:25:44&quo ...
- DataSet 图解
DataSet层次结构中的类请参见表所示: 类 说明 DataTableCollection 包含特定数据集的所有DataTable对象 DataTable 表示数据集中的一个表 DataColumn ...
- tomcat中的URL参数为中文,servlet接收后显示乱码
URL中参数的值为中文时,servlet接收后显示为乱码,如下图: 这时候需要修改tomcat的中的server.xml文件.该文件路径为 tomcat安装目录下的conf文件夹. 为修改前的se ...