持续创作,加速成长!这是我参与「掘金日新计划 · 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("王筝","《盗墓笔记》一点都不恐怖,很好看!");
}
}
运行结果