首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。