首页 > 代码库 > Spring之AOP

Spring之AOP

  日志,安全和事务管理都是AOP可以应用的地方。

  分布于应用中多处的功能被称为横切关注点。
  切点参数的含义:
  execution(* com.spring.service.AService.*(..))
  第一个*表示任意的返回类型,com.spring.service.AService制定了一个接口,第二*表示包含接口的任意方法,..表示任意的参数类型。指定了接口AService,则对实现了接口的任意子类都包含在内。
  execution(* com.spring.service.AService.*(..)) && within(com.spring.service.impl.*)
  表示同时要是com.spring.service.impl包下面的AService接口的实现类。表达式间的操作符包括&&,||,!或者and,or,not。
  如果需要知道一个方法执行花费了多长时间,环绕通知是很合适来完成的。
  为切点增加参数信息execution(* com.spring.service.AService.*(String)) and args(thoughts),将AService实现类方法中的String类型的thoughts作为参数传递给拦截器。
  使用注解时@Pointcut需要依附于一个方法,方法本身不重要,可以是空实现。

      基于注解及自动扫描实现IoC和AOP。

      配置文件contextByAspect.xml的信息:

<?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:aop="http://www.springframework.org/schema/aop"   xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">    <context:annotation-config />     <!-- 自动扫描(自动注入) -->    <context:component-scan base-package="com.spring..*"/>     <aop:aspectj-autoproxy/>    </beans>

        定义接口类:

package com.spring.service;/** * 接口A */public interface AService {        public void fooA(String _msg);    public void barA();}

  定义实现类:

package com.spring.service.impl;import org.springframework.stereotype.Component;import com.spring.service.AService;/** *接口A的实现类 */@Component("aService")public class AServiceImplByAspect implements AService {		public AServiceImplByAspect(){		System.out.println("a begin!");	}	    public void barA() {        System.out.println("AServiceImpl.barA()");    }	    public void fooA(String _msg) {        System.out.println("AServiceImpl.fooA(msg:"+_msg+")");    }}

  定义切面:

package com.spring.aop;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;/** * 切面 * */@Aspect@Componentpublic class TestAspectByAspect {	@Pointcut(value = "http://www.mamicode.com/execution(* com.spring.service.AService.*(..))") 	public void before(){			}	    public void doAfter(JoinPoint jp) {        System.out.println("log Ending method: "                + jp.getTarget().getClass().getName() + "."                + jp.getSignature().getName());    }    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {        long time = System.currentTimeMillis();        Object retVal = pjp.proceed();        time = System.currentTimeMillis() - time;        System.out.println("process time: " + time + " ms");        return retVal;    }        @Before(value = "http://www.mamicode.com/before()")    public void doBefore(JoinPoint jp) {        System.out.println("log Begining method: "                + jp.getTarget().getClass().getName() + "."                + jp.getSignature().getName());    }    public void doThrowing(JoinPoint jp, Throwable ex) {        System.out.println("method " + jp.getTarget().getClass().getName()                + "." + jp.getSignature().getName() + " throw exception");        System.out.println(ex.getMessage());    }    private void sendEx(String ex) {        //TODO 发送短信或邮件提醒    }} 

  定义单元测试类:

package com.spring.test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.stereotype.Component;import org.springframework.test.AbstractDependencyInjectionSpringContextTests;import com.spring.service.AService;import com.spring.service.impl.BServiceImplByAspect;public class AOPTestByAspect extends AbstractDependencyInjectionSpringContextTests {	@Autowired(required = false)	private  AService aService;		protected String[] getConfigLocations() {		String[] configs = new String[] { "/contextByAspect.xml"};		return configs;	}		/**	 * 测试正常调用	 */	public void testCall()	{		System.out.println("SpringTest JUnit test");		aService.fooA("JUnit test fooA");		aService.barA();	}			public void setAService(AService service) {		aService = service;	}	}

  

Spring之AOP