前文学习了spring的MethodBeforeAdvice接口,需要重写before方法,然后在before方法里写额外功能代码,还有一种是实现MethodInterceptor接口,重写invoke方法,invoke方法中可以写额外功能代码,也能执行原始方法,具体看代码
1.首先新建一个arround类实现MethodInterceptor接口,并重写invoke方法
public class arround implements MethodInterceptor {
/*
* invoke方法的作用:额外功能书写在invoke方法
* 额外功能可以运行在原始方法之前,之后,或者前后都执行
* 参数:MethodInvocation:指的是额外功能所增加给的那个原始方法
* 额外功能加给了谁,invocation.proceed()就代表让哪个方法执行
*
* Object返回值代表的是原始方法执行后的返回值
*
* */
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("额外功能=============");
Object proceed = (Object) invocation.proceed();//让原始方法运行
return proceed;
}
}
2.同样定义原始方法
public interface UserService1 {
public void login(String name,String password);
public void logout();
}
public class UserServiceImpl implements UserService1 {
public void login(String name, String password) {
System.out.println("login.method");
}
public void logout() {
System.out.println("logout.method");
}
}
3.编写spring配置文件
<bean id="userService1" class="proxy.UserServiceImpl"></bean>
<!-- <bean id="before" class="dynamic.Before"></bean>-->
<bean id="around" class="dynamic.arround"></bean>
<aop:config>
<!--所有的方法都作为切入点,加入额外功能-->
<aop:pointcut id="pc" expression="execution(* *(..))"/>
<!--目的把切入点和额外功能进行整合-->
<aop:advisor advice-ref="around" pointcut-ref="pc"></aop:advisor>
</aop:config>
4.运行测试类,看运行结果
@Test
public void test14(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext5.xml");
UserService1 userService = (UserService1) ctx.getBean("userService1");
userService.login("wang","123");
}