Spring框架的AOP通知类型

61 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

Spring的AOP通知类型(了解)

Spring支持AOP的编程,常用的有以下几种:

1)Before通知:在目标方法被调用前调用,涉及接口org.springframework.aop.MethodBeforeAdvice;
2)After通知:在目标方法被调用后调用,涉及接口为org.springframework.aop.AfterReturningAdvice;
3)Throws通知:目标方法抛出异常时调用,涉及接口org.springframework.aop.ThrowsAdvice;
4)Around通知:拦截对目标对象方法调用,涉及接口为org.aopalliance.intercept.MethodInterceptor。

案例:

LogAdvice.java****

**public** **class** LogAdvice **implements** MethodBeforeAdvice {

**private** **static** SimpleDateFormat *sf*=**new** SimpleDateFormat("yyyy年MM月dd日");

@Override

**public** **void** before(Method m, Object[] args, Object arg2)

**throws** Throwable {

System.***out***.println("\n[系统日志]["+*sf*.format(**new** Date())+"]"+m.getName()+"("+Arrays.*toString*(args)+")");

}

}

BookService .java

**public** **interface** BookService {

 

**public** **boolean** buy(String userName,String bookName,**double** price);

**public** **void** comment(String userName,String comments);

}

BookServiceImpl .java

**public** **class** BookServiceImpl **implements** BookService {

/**

 * 购买图书

 */

@Override

**public** **boolean** buy(String userName, String bookName, **double** price) {

System.***out***.println("业务buy开始执行");

System.***out***.println(userName+"购买了图书"+bookName);

System.***out***.println(userName+"增加积分"+(**int**)(price/10));

System.***out***.println("图书购买完毕,向物流下单....");

System.***out***.println("业务buy结束");

**return** **true**;

}

/**

 * 发表评论

 */

@Override

**public** **void** comment(String userName, String comments) {

System.***out***.println("业务comment开始执行");

System.***out***.println(userName+"发表图书评论"+comments);

System.***out***.println("业务comment执行结束");

}

}

applicationContext.xml

<!-- 实现业务功能的实现类 -->

<bean id= *"bookServiceTarget"*  class= *"com.oracle.aop.biz.impl.BookServiceImpl"* ></bean>

<!-- 日志功能 -->

<bean id= *"logAdvice"*  class= *"com.oracle.aop.LogAdvice"* ></bean>

<bean id= *"bookService"*  class= *"org.springframework.aop.framework.ProxyFactoryBean"* >

<!-- 将要绑定的业务接口 -->

<property name= *"proxyInterfaces"* >

<value>com.oracle.aop.biz.BookService</value>

</property>

<!-- 实现日志功能的切面 -->

<property name= *"interceptorNames"* >

<list>

<value>logAdvice</value>

</list>

</property>

<!-- 织入 -->

<property name= *"target"*  ref= *"bookServiceTarget"* ></property>

</bean>

TestAOP.java

**public** **class** TestAOP {

@Test

**public** **void** testAop(){

ApplicationContext context=**new** ClassPathXmlApplicationContext("applicationContext.xml");

BookService bookservice=(BookService)context.getBean("bookService");

bookservice.buy("高志水", "CMMi实务手册", 50);

bookservice.comment("王筝","《盗墓笔记》一点都不恐怖,很好看!");

}

}

运行结果

image.png