Spring AOP

发布时间:2016-12-9 17:46:08 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Spring AOP",主要涉及到Spring AOP方面的内容,对于Spring AOP感兴趣的同学可以参考一下。

1. 什么是AOP及其好处 *   Aspect Oriented Programming 面向方面编程戒面向切面编程。  AOP关注点是共同处理,可以通过配置将其作用到某一个戒多个目标对象上。好处是实现组件重复 利用,改善程序结构,提高灵活性。将共通组件不目标对象解耦。  2. AOP相关概念 *  1) Aspect切面(方面)   指的是共通业务处理,可以切入到多个目标对象,可多次使用  2) JoinPoint连接点   指的是切面组件在目标对象上作用的位置,  例如:方法上戒者发生异常。  3) Pointcut切入点   切入点是连接点的集合,采用表达式指定  4) Target Object目标对象  5) Advice通知  指的是切面组件在连接点上执行的劢作。  例如:在方法调用前、方法调用后、方法调用前后等。  6) AutoProxy劢态代理   采用了AOP乊后,容器返回的对象是代理对象。用户在使用时,由代理对象调用切面组件和  目标对象的功能。  a. 目标对象有接口采用JDK代理、  b. 目标对象没有接口采用CGLIB代理  【案例1】AOP演示 **  1) 新建工程spring2  2) 导入Jar包  AoP需要的Jar包:aspectjrt.jar和aspectjweaver.jar  劢态代理需要cglib.jar  3) 新建接口UserServie  package tarena.service; public interface UserService { public void update(); public void delete(); public void save(); } 4) 新建实现类UserServiceImpl  package tarena.service; public class UserServiceImpl implements UserService { public void delete() {System.out.println("删除用户信息");} public void save() {System.out.println("保存用户信息");} public void update() {System.out.println("更新用户信息");} } 5) 新建aop.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: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="userserivce" class="tarena.service.UserServiceImpl"> </bean> </beans> 6) 新建Test  package tarena.service; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private static final String CONFIG = "aop.xml"; /** * @param args */ public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext(CONFIG); UserService userService = (UserService)ac.getBean("userserivce"); userService.update(); userService.save(); userService.delete(); } } 7) 运行Test  如上,已经将UserService纳入Spring容器的管理中。  我们现在又这样的需求,要为UserSerice的操作增加日志记录功能。  我们需要为更新、保存、删除操作增加记录日志功能,那么记录日志功能就属于切面功能。  增加AoP功能  8) 新建aop.OptLogger  在Spring中,切面组件只要是普通的bean即可。  OptLogger是记录操作日志的切面组件 package tarena.aop; /** * 切面组件,记录操作日志 * @author tarena * */ public class OptLogger { public void logger(){ System.out.println("记录操作日志了..."); } } 9) 修改aop.xml  将切面组件OptLogger加入到配置文件中;配置aop  <?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="userserivce" class="tarena.service.UserServiceImpl"></bean> <bean id="optlogger" class="tarena.aop.OptLogger"></bean> <aop:config> <aop:pointcut id="servicepointcut" expression="execution(* tarena.service.*.*(..))" /> <aop:aspect id="loggeraspect" ref="optlogger"> <aop:before method="logger" pointcut-ref="servicepointcut"/> </aop:aspect> </aop:config> </beans> <aop:aspect > 用于配置切面  . id属性  . ref属性 用于关联切面的bean  <aop:pointcut/>用于设置切入点  . expression属性 类似于正则形式的表达式(后期讲,先使用)  execution()用于设置方法限定  . execution(* tarena.service.*.*(..))  表示丌限定返回类型,限定指定tarena.service包下的  所有方法,丌限定参数类型  . <aop:before> 表示采用before这种通知,作用于pointcut和方法上  10) 运行Test  在操作乊前都进行了记录日志操作通知  如果这样会在操作后记录日志  11) 修改aop.xml   <bean id="userserivce" class="tarena.service.UserServiceImpl"></bean> <bean id="optlogger" class="tarena.aop.OptLogger"></bean> <aop:config> <aop:pointcut id="servicepointcut" expression="execution(* tarena.service.*.*(..))" /> <aop:aspect id="loggeraspect" ref="optlogger"> <aop:before method="logger" pointcut-ref="servicepointcut"/> </aop:aspect> </aop:config> </beans>12) 运行Test   我们如果想将操作的内容在日志中做一些记录,该怎么做?  13) 修改aop.xml  <bean id="userserivce" class="tarena.service.UserServiceImpl"></bean> <bean id="optlogger" class="tarena.aop.OptLogger"></bean> <aop:config> <aop:pointcut id="servicepointcut" expression="execution(* tarena.service.*.*(..))" /> <aop:aspect id="loggeraspect" ref="optlogger"> <aop:around method="logger" pointcut-ref="servicepointcut"/> </aop:aspect> </aop:config> </beans> 14) 修改OptLogger  当aop.xml中设置为<aop:around>通知形式后,我们可以通过ProceedingJoinPoint对象(连 接点)来获取方法名、类名等。  package tarena.aop; import org.aspectj.lang.ProceedingJoinPoint; /** * 切面组件,记录操作日志 * @author tarena * */ public class OptLogger { public Object logger(ProceedingJoinPoint pjp) throws Throwable{ //proceed()方法有执行目标对象的功能 Object obj = pjp.proceed(); //获取方法名 String method = pjp.getSignature().getName(); //获取目标对象类名 String clazzName = pjp.getTarget().getClass().getName(); System.out.println( "执行了" + clazzName + "的" + method + "方法"); return obj; } } 15) 运行Test   我们可以做的更用户友好些  16) 新建opt.properties  内容是更友好的一些文字描述  tarena.service.UserServiceImpl.update=\u7528\u6237\u66f4\u65b0\u64cd\u4f5c  tarena.service.UserServiceImpl.save=\u7528\u6237\u4fdd\u5b58\u64cd\u4f5c  tarena.service.UserServiceImpl.delete=\u7528\u6237\u5220\u9664\u64cd\u4f5c  17) 新建PropertiesUtil  package tarena.util; import java.io.IOException; import java.util.Properties; public class PropertiesUtil { static Properties props = new Properties(); private PropertiesUtil(){} public static Properties getInstance(String path) throws IOException{ props.load( PropertiesUtil.class.getClassLoader() .getResourceAsStream(path)); return props; } public static String getProperty(String key){ String val = ""; if(props != null){ String prop = props.getProperty(key); if(prop != null){ val = prop; } } return val; } } 18) 修改OptLogger  package tarena.aop; import org.aspectj.lang.ProceedingJoinPoint; import tarena.util.PropertiesUtil; /** * 切面组件,记录操作日志 * @author tarena * */ public class OptLogger { public Object logger(ProceedingJoinPoint pjp) throws Throwable{ Object obj = pjp.proceed();//执行目标对象的功能 String methodName = pjp.getSignature().getName(); String clazzName = pjp.getTarget().getClass().getName(); PropertiesUtil.getInstance("tarena/opt.properties"); String key = clazzName+"."+methodName; System.out.println( "执行了"+PropertiesUtil.getProperty(key)); return obj; } } 19) 运行Test    如上案例,我们可以了解到IoC是解决两个对象乊间的关系,AOP是解决一个对象和某一批  对象乊间的关系。  (案例结束) 

上一篇:利用BMP图片水印技术写入加密信息
下一篇:Windows 7系统盘清理

相关文章

关键词: Spring AOP

相关评论