Spring 入门 AOP

通过一个小例子演视怎么使用 Spring 现实面向切面编程。

导入 Spring 所需要的包

spring-framework-2.5.6 版需要导入以下包: 1.—– spring.jar2.—– commons-logging.jar3.—– aspectjrt.jar4.—– aspectjweaver.jar5.—– cglib-nodep-2.1_3.jar

spring-framework-3.2.4 版需要导入以下包: 1.—– spring-core-3.2.4.RELEASE.jar2.—– spring-beans-3.2.4.RELEASE.jar3.—– spring-context-3.2.4.RELEASE.jar4.—– spring-expression-3.2.4.RELEASE.jar5.—– commons-logging.jar6.—– aspectjweaver.jar7.—– aspectjrt.jar8.—– aopalliance.jar(spring项目里不提供,要到网上下)

代码:

Book.java:

public class Book {private int id;private String name;//省略get set方法…. }

BookService.java:

public class BookService {public void save(Book book){System.out.println(“save:”+book.getName());}}

main方法:

main(String[] args) {ApplicationContext appctx = new ClassPathXmlApplicationContext(“applicationContext.xml”);Book b = (Book)appctx.getBean(“book”);b.setName(“j2ee”);BookService bs = (BookService)appctx.getBean(“bookService”);//调用BookService的save方法。 bs.save(b);((ClassPathXmlApplicationContext)appctx).close();}

通过使用Spring AOP 在调用BookService的save方法前后各加上一些业务(如记录日志,时间等等)方便起见,这里简单输出两句话。

使用配置文件配置AOP(Schema)

添加切面类 Log.java :

public class Log { before(JoinPoint jp){System.out.println(jp.getSignature().getName()+”:开始执行———-“);// 获取被代理对象System.out.println(“被代理对象:”+jp.getTarget().getClass());// 获取被代理方法System.out.println(“被代理方法:”+jp.getSignature());// 获取方法参数System.out.println(“方法参数:”+jp.getArgs());} afterreturning(JoinPoint jp,Object rn){System.out.println(jp.getSignature().getName()+”:执行完毕———-“);System.out.println(rn);}}

Spring配置文件:

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xmlns:aop=”http://www.springframework.org/schema/aop”xsi:schemaLocation=”http://www.springframework.org/schema/beans”

注:要使用aop:标签要先引入aop命名空间(第4、7、8行)

使注解配置AOP(Annotation)

Spring配置文件:

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”

添加切面类 Log.java :

@Component@Aspect Log {//前置通知(增强):指明切入点方法执行前执行该方法//后面参数指定了插入点@Before(“execution(public void com.startspring.BookService.save(com.startspring.Book))”)public void before(JoinPoint jp){System.out.println(jp.getSignature().getName()+”:开始执行———-“);// 获取被代理对象System.out.println(“被代理对象:”+jp.getTarget().getClass());// 获取被代理方法System.out.println(“被代理方法:”+jp.getSignature());// 获取方法参数System.out.println(“方法参数:”+jp.getArgs());}//后置通知(增强):指明切入点方法执行完毕执行该方法//returning=”rn” :声明参数rn是目标方法的返回值(void为null)@AfterReturning(returning=”rn”,value=”execution(public void com.startspring.BookService.save(com.startspring.Book))”)public void afterreturning(JoinPoint jp,Object rn){System.out.println(jp.getSignature().getName()+”:开始完毕———-“);System.out.println(rn);}}

这里Bean的声明也采用了注解,要在Book.java和BookService.java里添加相应的注解。或在配置文件中写<bean>也是可以的。

通过现实接口配置AOP

添加切面类 Log.java :

/* * 通过实现 MethodBeforeAdvice 实现前置处理。AfterReturningAdvice:后置处理。 * 分别重写方法:before,,afterReturning Log implements MethodBeforeAdvice,AfterReturningAdvice{before(Method method, Object[] args, Object target)throws Throwable {System.out.println(method.getName()+”:开始执行———-“);// 获取被代理对象System.out.println(“被代理对象:”+target);// 获取被代理方法System.out.println(“被代理方法:”+method);// 获取方法参数System.out.println(“方法参数:”+args);}afterReturning(Object result, Method method, Object[] args,Object target) throws Throwable {System.out.println(method.getName()+”:执行完毕———-“);System.out.println(result);}}

Spring配置文件:

人生就是要感受美丽的、善良的,丑恶的、病态的。

Spring 入门 AOP

相关文章:

你感兴趣的文章:

标签云: