码迷,mamicode.com
首页 > 编程语言 > 详细

Spring之AOP

时间:2014-09-30 16:49:19      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   ar   java   for   

  日志,安全和事务管理都是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/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://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
@Component
public class TestAspectByAspect {
	@Pointcut(value = "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 = "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

标签:style   blog   http   color   io   使用   ar   java   for   

原文地址:http://www.cnblogs.com/lnlvinso/p/4001972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!