AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法:
1)JoinPoint
java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
Signature getSignature() :获取连接点的方法签名对象;
java.lang.Object getTarget() :获取连接点所在的目标对象;
java.lang.Object getThis() :获取代理对象本身;
2)ProceedingJoinPoint
ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:
java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
Java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。
一、概述
AOP的实现方法在上两篇博客中已经用了两种方法来实现现在的问题来了虽然我们利用AOP,那么客户端如何信息传递?利用JoinPoint接口来实现客户端给具体实现类的传递参数。
二、代码演示。
目录结构:
SecurityHandler.java
package import public SecurityHandler{
- checkSecurity(JoinPoint joinPoint){
- ( i = ; i < joinPoint.getArgs().length; i++) {
- );
- }
Client.java
package import import import public Client {
- main(String[] args) {
- ClassPathXmlApplicationContext();
- UserManager userManager=(UserManager) factory.getBean();
- , );
- }
UserManager.java
package public UserManager {
- addUser(String username,String password);
- delUser( userId);
- String findUserById( userId);
- modifyUser( userId,String username,String password);
- }
UserManagerImpl.java
package public UserManagerImpl UserManager {
- addUser(String username, String password) {
- );
- delUser( userId) {
- );
- String findUserById( userId) {
- );
- ;
- modifyUser( userId, String username, String password) {
- );
- // private void checkSecurity(){ // System.out.println("checkSecurity"); // // } }
applicationContext.xml
<? = =?> < =
- =
- =
- =
- ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- < = =
- = =/> <> = => = =
- = =
- > </> </>
效果图:
三、总结。
我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得。