测试方法
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.neuedu.spring.service.UserServiceIfac;
public class Test1 {
public static void main(String[] args) {
ApplicationContext act=new ClassPathXmlApplicationContext("beans.xml");
UserServiceIfac userService=(UserServiceIfac) act.getBean("userService");
userService.login();
userService.register();
}
}
测试结果![]() |
---|
| <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="userService" class="com.neuedu.spring.service.UserServiceImpl"></bean>
<bean id="serviceInterceptor" class="com.neuedu.spring.interceptor.ServiceInterceptor"></bean>
<!-- 还要配置代理对象,测试的时候不会访问这个对象 -->
<aop:config>
<!-- 拦截service的功能扩展 -->
<aop:aspect ref="serviceInterceptor"><!--aop:aspect定义切面 -->
<!-- aop:pointcut切入点
expression属性表示拦截com.neuedu.spring.service包及子包里面的所有类的所有方法,
不管方法需不需要参数,有没有返回值
-->
<aop:pointcut expression="execution(* com.neuedu.spring.service..*.login*(..))" id="loginMethod"/>
<aop:pointcut expression="execution(* com.neuedu.spring.service..*.register*(..))" id="registerMethod"/>
<!-- method属性的值是方法名,那么这个方法名来自哪里呢?来自切面引用的拦截器的类中的方法 -->
<aop:before method="printLog" pointcut-ref="loginMethod" />
<aop:around method="time" pointcut-ref="registerMethod" />
</aop:aspect>
<!-- 拦截dao的功能扩展 -->
<!-- 拦截controller的功能扩展 -->
</aop:config>
</bean>
UserServiceIfac接口的实现方法UserServiceImpl
public class UserServiceImpl implements UserServiceIfac {
@Override
public void login()
{
System.out.println("UserService login方法");
}
@Override
public void register()
{
System.out.println("UserService register方法");
}
}
这个拦截器定义给service层扩展的所有功能:
package com.neuedu.spring.interceptor;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 这个拦截器定义给service层扩展的所有功能:
方法调用前权限校验
方法调用时计时
方法调用后写日志
注意:该拦截器不用实现任何接口
*/
public class ServiceInterceptor {
/**
* 目标对象方法调用中的计时功能扩展
* 为什么要在方法参数列表中声明JoinPoint joinPoint这个对象,因为要调用目标对象的方法
*/
public Object time(ProceedingJoinPoint joinPoint)
{
Object result=null;
//1.开始计时
System.out.println("计时开始");
Long startTime=System.currentTimeMillis();
//2.调用目标对象方法
try {
result=joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}//这行代码表示调用目标对象的方法
//3.计时结束
Long endTime=System.currentTimeMillis();
System.out.println("计时结束,一共花费了"+(endTime-startTime)+"毫秒");
return result;
}
/**
* 目标对象方法调用前的功能扩展
*/
public void checkUser()
{
System.out.println("权限校验");
}
/**
* 目标对象方法调用后的功能扩展:
* 如果希望获取目标对象方法的返回值,请参考这篇博文https://www.cnblogs.com/d-i-p/p/10676829.html
*/
public void printLog()
{
//System.out.println("目标对象方法的返回值:"+returnVal);
System.out.println("写日志");
}
}