要进行AOP编程,首先就要引入aop命名空间,Spring提供了两种切面方式,实际工作中我们可以任选其一:
切面类:
public class Security { //切面
public void checkSecurity(JoinPoint joinPoint){ //通知
System.out.println("进行安全检查 ");
}
}
如果使用XML配置方式,需要在文件中使用<aop:config>标签,如:
<bean id="security" class="切面类" /><!-- 定义切面对象 -->
<bean id="userManager" class="目标对象类" /><!--创建接口实现类对象-->
<aop:config> <!--所有的切面和通知都必须定义在aop:config元素内部 -->
<aop:aspect ref="security"> <!-- 声明切面 -->
<!-- 声明切入点 -->
<aop:pointcut id="userManagerPointcut"
expression="execution(* *.*(..))"/>
<!--声明后置通知,在匹配的方法完全执行后运行-->
<aop:after-returning method="checkSecurity" pointcut-ref="userManagerPointcut"/>
</aop:aspect>
</aop:config>
如果想在通知中获取相关数据,任何通知方法可以将第一个参数定义为org.aspectj.lang.JoinPoint
类型 (环绕通知需要定义第一个参数为ProceedingJoinPoint
类型, 它是 JoinPoint
的一个子类)。JoinPoint
接口提供了一系列有用的方法,比如 getArgs()
(返回方法参数)、 getThis()
(返回代理对象)、getTarget()
(返回目标)、 getSignature()
(返回正在被通知的方法签名)和 toString()
(打印出正在被通知的方法的有用信息)。
基于注解的方式除了在配置文件中引入aop的命名空间以外,还需要打开自动代理:
<aop:aspectj-autoproxy/>
这个标签将启用Spring对@AspectJ的支持,配置文件里面只需要声明切面对象和目标对象就行了,在类上标注@Aspect注解用以声明切面,然后在切面的方法上面标注通知或者切入点.
定义切入点的几点注意:
* 切入点使用方法定义的形式出现
* 方法的定义
* 方法的修饰符private修饰
* 方法的返回值类型是void
* 方法的名称自定义
* 方法没有参数
* 方法有方法体,方法体为空
在方法上使用@Pointcut定义切入点,如:
@Pointcut("execution( * cn.itcast.aop.aspectJ.before.UserManagerImpl.save*(..))")
private void perform(){}
切入点表达式写法:
* 切入点表达式的写法
* execution(主要)表示匹配方法执行的连接点
* 例如: * com.itcast.service..*.save*(..))
* 1 "*" 表示方法的返回类型任意
* 2 com.itcast.service..* 表示service包及其子包中所有的类
* 3 .save* 表示类中所有以save开头的方法
* 4 (..) 表示参数是任意数量
定义通知:
/**
* @Before表示前置通知
* 等价于
* aop:before method="checkSecurity" pointcut-ref="perform"
* @param joinPoint
*/
@Before("perform()||perform1()") //可以使用多个切入点,用||隔开
public void checkSecurity(JoinPoint joinPoint){
System.out.println("进行安全性检查");
if(joinPoint.getArgs()!=null&&joinPoint.getArgs().length>0){
for(int i=0;i<joinPoint.getArgs().length;i++){
System.out.println("方法的参数 "+joinPoint.getArgs()[i]);
}
}
//获取方法的签名,方法的名称,方法的返回类型
Signature signature=joinPoint.getSignature();
System.out.println("方法的名称 "+signature.getName());
}
更多信息请查看 java进阶网 http://www.javady.com