xmlconfig把spring的AOP编程走一遍

测试方法

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("写日志");
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值