- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- UserBean userBean = (UserBean) targetObject;
- String userName = userBean.getUserName();
- Object result = null;
- if(userName!=null && !"".equals(userName)) {
- //调用目标对象的方法
- try {
- //前置通知
- result = method.invoke(targetObject, args);
- //后置通知
- } catch(Exception e) {
- //例外通知
- } finally {
- //最终通知
- }
- }
- //环绕通知(前置通知之后,目标对象方法调用之前执行,全部执行完毕(最终通知)之后)
- return result;
- }
1.使用anotation 实现aop
1)编写类MyInterceptor.java
public MyInterceptor{
//定义切入点pointCutMethod(),拦截包com.dexter下所有子包的所有类的所有方法
@Pointcut("execution(* com.dexter..*.*(..))")
private void pointCutMethod(){}
//前置通知
@Before("pointCutMethod()")
public void doBefore()
{
System.out.pritnln("前置通知");
}
//后置通知
@AfterReturning("pointCutMethod()")
public void doAfterReturning()
{
System.out.println("后置通知");
}
//异常通知
@AfterThrowing("pointCutMethod()")
public void doAfterThrowing(){
System.out.pritnln("异常通知");
}
//最终通知
@After("pointCutMethod()")
public void doAfter(){
System.out.pritnln("最终通知")
}
//环绕通知
@Around("pointCutMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("进入方法");
Object result = pjp.proceed();
System.out.println("退出方法");
return result;
}
}
2)配置文件
<!-- 表示打开aspect注解处理器,自动生成代理类 -->
<aop:aspectj-autoproxy />
<bean id="userBean" class="com.dexter.dynamicproxy.UserBean"></bean>
<bean id="myInterceptor" class="com.dexter.aop.MyInterceptor"></bean>
2.获取方法调用参数
//需要两个条件同时成立. args(userName)代表只有一个参数且为String类型 名称必须与doBefore方法的参数名称一样
@Before("pointCutMethod() && args(username)")
public void doBefore(String username) {
System.out.println("前置通知"+"username="+username);
}
3.后置通知获取返回值
//配置returning="result", result必须和doAfterReturning的参数一致
@AfterReturning(pointcut="pointCutMethod()",returning="result")
public void doAfterReturning(String result) {
System.out.println("后置通知"+",result="+result);
}
4.使用xml配置aop
1)一个普通的类作为拦截器
import org.aspectj.lang.ProceedingJoinPoint;
public class NoneAnotationInterceptor {
public void doBefore(String username) {
System.out.println("前置通知"+"username="+username);
}
public void doAfterReturning(String result) {
System.out.println("后置通知"+",result="+result);
}
public void doAfterException(Exception e) {
System.out.println("异常通知,exception="+e.getMessage());
}
public void doAfter() {
System.out.println("最终通知");
}
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入方法");
Object object = pjp.proceed();
System.out.println("退出方法");
return object;
}
}
2)写配置文件,配置拦截器
<bean id="myInterceptor"
class="com.dexter.aop.NoneAnotationInterceptor">
</bean>
<bean id="userBean" class="com.dexter.dynamicproxy.UserBean"></bean>
<aop:config>
<aop:aspect id="asp" ref="myInterceptor">
<aop:pointcut id="myCut"
expression="execution(* com.dexter..*.*(..))" />
<aop:before
pointcut="execution(* com.dexter..*.*(..)) and args(username)"
method="doBefore" />
<aop:after pointcut-ref="myCut" method="doAfter" />
<aop:after-returning pointcut-ref="myCut"
method="doAfterReturning" returning="result" />
<aop:after-throwing pointcut-ref="myCut"
method="doAfterException" throwing="e" />
<aop:around pointcut-ref="myCut" method="doAround" />
</aop:aspect>
</aop:config>