課程
/后端開發(fā)
/Java
/Spring Boot進(jìn)階之Web進(jìn)階
老師有用注解的方式的列子嗎
2017-09-24
源自:Spring Boot進(jìn)階之Web進(jìn)階 2-3
正在回答
Spring對(duì)AOP的實(shí)現(xiàn)提供了很好的支持。下面我們就使用Spring的注解來完成AOP做一個(gè)例子。
首先,為了使用Spring的AOP注解功能,必須導(dǎo)入如下幾個(gè)包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.
然后我們寫一個(gè)接口
[java]?view plain?copy?print?
package?com.bird.service;??
??
public?interface?PersonServer?{??
????public?void?save(String?name);??
????public?void?update(String?name,?Integer?id);??
????public?String?getPersonName(Integer?id);??
??????
}??
和一個(gè)接口實(shí)現(xiàn)類
package?com.bird.service.impl;??
import?com.bird.service.PersonServer;??
public?class?PersonServiceBean?implements?PersonServer{??
????@Override??
????public?void?save(String?name)?{??
??????????
????????System.out.println("我是save方法");??
????//??throw?new?RuntimeException();??
????}??
????public?void?update(String?name,?Integer?id)?{??
????????System.out.println("我是update()方法");??
????public?String?getPersonName(Integer?id)?{??
????????System.out.println("我是getPersonName()方法");??
????????return?"xxx";??
下面使用Spring注解方式對(duì)這個(gè)Bean進(jìn)行方法攔截
import?org.aspectj.lang.ProceedingJoinPoint;??
import?org.aspectj.lang.annotation.After;??
import?org.aspectj.lang.annotation.AfterReturning;??
import?org.aspectj.lang.annotation.AfterThrowing;??
import?org.aspectj.lang.annotation.Around;??
import?org.aspectj.lang.annotation.Aspect;??
import?org.aspectj.lang.annotation.Before;??
import?org.aspectj.lang.annotation.Pointcut;??
/**?
?*?切面?
?*?@author?Bird?
?*?
?*/??
@Aspect??
public?class?MyInterceptor?{??
????@Pointcut("execution(*?com.bird.service.impl.PersonServiceBean.*(..))")??
????private?void?anyMethod(){}//定義一個(gè)切入點(diǎn)??
????@Before("anyMethod()?&&?args(name)")??
????public?void?doAccessCheck(String?name){??
????????System.out.println(name);??
????????System.out.println("前置通知");??
????@AfterReturning("anyMethod()")??
????public?void?doAfter(){??
????????System.out.println("后置通知");??
????@After("anyMethod()")??
????public?void?after(){??
????????System.out.println("最終通知");??
????@AfterThrowing("anyMethod()")??
????public?void?doAfterThrow(){??
????????System.out.println("例外通知");??
????@Around("anyMethod()")??
????public?Object?doBasicProfiling(ProceedingJoinPoint?pjp)?throws?Throwable{??
????????System.out.println("進(jìn)入環(huán)繞通知");??
????????Object?object?=?pjp.proceed();//執(zhí)行該方法??
????????System.out.println("退出方法");??
????????return?object;??
@Pointcut("execution(*?com.bird.service.impl.PersonServiceBean.*(..))")??
這句話是方法切入點(diǎn),execution為執(zhí)行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包。(..)代
表各種方法.
然后下面的注解就比較簡(jiǎn)單了,就是在使用方法前和中,還有環(huán)繞攔截/
然后在Spring的配置文件中繼續(xù)配置Bean,需要打開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: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/aop???
???????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">??
????????<aop:aspectj-autoproxy/>??
????<bean?id="personServiceBean"?class="com.bird.service.impl.PersonServiceBean"/>??
????<bean?id="myInterceptor"?class="com.bird.service.MyInterceptor"/>??
?????
</beans>??
然后建立一個(gè)Junit測(cè)試
package?junit.test;??
import?org.junit.Test;??
import?org.springframework.context.ApplicationContext;??
import?org.springframework.context.support.ClassPathXmlApplicationContext;??
public?class?SpringAOPTest?{??
????@Test??
????public?void?inteceptorTest(){??
????????ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext("beanAop.xml");??
????????PersonServer?bean?=?(PersonServer)ctx.getBean("personServiceBean");??
????????bean.save(null);??
測(cè)試結(jié)果為
2012-3-12?18:08:39?org.springframework.context.support.AbstractApplicationContext?prepareRefresh??
信息:?Refreshing?org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6:?display?name?[org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6];?startup?date?[Mon?Mar?12?18:08:39?CST?2012];?root?of?context?hierarchy??
2012-3-12?18:08:40?org.springframework.beans.factory.xml.XmlBeanDefinitionReader?loadBeanDefinitions??
信息:?Loading?XML?bean?definitions?from?class?path?resource?[beanAop.xml]??
2012-3-12?18:08:40?org.springframework.context.support.AbstractApplicationContext?obtainFreshBeanFactory??
信息:?Bean?factory?for?application?context?[org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]:?org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7??
2012-3-12?18:08:40?org.springframework.beans.factory.support.DefaultListableBeanFactory?preInstantiateSingletons??
信息:?Pre-instantiating?singletons?in?org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7:?defining?beans?[org.springframework.aop.config.internalAutoProxyCreator,personServiceBean,myInterceptor];?root?of?factory?hierarchy??
null??
前置通知??
進(jìn)入環(huán)繞通知??
我是save方法??
后置通知??
退出方法??
最終通知??
舉報(bào)
《2小時(shí)學(xué)習(xí)Spring Boot》之進(jìn)階教程,針對(duì)Web方面的相關(guān)技巧
4 回答aop沒用啊
2 回答Aop環(huán)節(jié)講解的問題
1 回答使用aop,配置Pointcut有問題
1 回答為啥不用過濾器呢,而非用aop呢
1 回答如果在實(shí)體屬性上添加@NotNull注解如何不用枚舉
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2017-09-25
Spring對(duì)AOP的實(shí)現(xiàn)提供了很好的支持。下面我們就使用Spring的注解來完成AOP做一個(gè)例子。
首先,為了使用Spring的AOP注解功能,必須導(dǎo)入如下幾個(gè)包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.
然后我們寫一個(gè)接口
[java]?view plain?copy?print?
package?com.bird.service;??
??
public?interface?PersonServer?{??
??
????public?void?save(String?name);??
????public?void?update(String?name,?Integer?id);??
????public?String?getPersonName(Integer?id);??
??????
}??
和一個(gè)接口實(shí)現(xiàn)類
[java]?view plain?copy?print?
package?com.bird.service.impl;??
??
import?com.bird.service.PersonServer;??
??
public?class?PersonServiceBean?implements?PersonServer{??
??????
????@Override??
????public?void?save(String?name)?{??
??????????
????????System.out.println("我是save方法");??
????//??throw?new?RuntimeException();??
????}??
??
????@Override??
????public?void?update(String?name,?Integer?id)?{??
??????????
????????System.out.println("我是update()方法");??
????}??
??
????@Override??
????public?String?getPersonName(Integer?id)?{??
??????????
????????System.out.println("我是getPersonName()方法");??
????????return?"xxx";??
????}??
??
}??
下面使用Spring注解方式對(duì)這個(gè)Bean進(jìn)行方法攔截
[java]?view plain?copy?print?
package?com.bird.service;??
??
import?org.aspectj.lang.ProceedingJoinPoint;??
import?org.aspectj.lang.annotation.After;??
import?org.aspectj.lang.annotation.AfterReturning;??
import?org.aspectj.lang.annotation.AfterThrowing;??
import?org.aspectj.lang.annotation.Around;??
import?org.aspectj.lang.annotation.Aspect;??
import?org.aspectj.lang.annotation.Before;??
import?org.aspectj.lang.annotation.Pointcut;??
??
/**?
?*?切面?
?*?@author?Bird?
?*?
?*/??
@Aspect??
public?class?MyInterceptor?{??
????@Pointcut("execution(*?com.bird.service.impl.PersonServiceBean.*(..))")??
????private?void?anyMethod(){}//定義一個(gè)切入點(diǎn)??
??????
????@Before("anyMethod()?&&?args(name)")??
????public?void?doAccessCheck(String?name){??
????????System.out.println(name);??
????????System.out.println("前置通知");??
????}??
??????
????@AfterReturning("anyMethod()")??
????public?void?doAfter(){??
????????System.out.println("后置通知");??
????}??
??????
????@After("anyMethod()")??
????public?void?after(){??
????????System.out.println("最終通知");??
????}??
??????
????@AfterThrowing("anyMethod()")??
????public?void?doAfterThrow(){??
????????System.out.println("例外通知");??
????}??
??????
????@Around("anyMethod()")??
????public?Object?doBasicProfiling(ProceedingJoinPoint?pjp)?throws?Throwable{??
????????System.out.println("進(jìn)入環(huán)繞通知");??
????????Object?object?=?pjp.proceed();//執(zhí)行該方法??
????????System.out.println("退出方法");??
????????return?object;??
????}??
}??
[java]?view plain?copy?print?
@Pointcut("execution(*?com.bird.service.impl.PersonServiceBean.*(..))")??
這句話是方法切入點(diǎn),execution為執(zhí)行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包。(..)代
表各種方法.
然后下面的注解就比較簡(jiǎn)單了,就是在使用方法前和中,還有環(huán)繞攔截/
然后在Spring的配置文件中繼續(xù)配置Bean,需要打開AOP命名空間
[java]?view plain?copy?print?
<?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"??
???????xsi:schemaLocation="??
???????http://www.springframework.org/schema/beans???
???????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd??
???????http://www.springframework.org/schema/aop???
???????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">??
??????????
????????<aop:aspectj-autoproxy/>??
????<bean?id="personServiceBean"?class="com.bird.service.impl.PersonServiceBean"/>??
????<bean?id="myInterceptor"?class="com.bird.service.MyInterceptor"/>??
?????
</beans>??
然后建立一個(gè)Junit測(cè)試
[java]?view plain?copy?print?
package?junit.test;??
??
import?org.junit.Test;??
import?org.springframework.context.ApplicationContext;??
import?org.springframework.context.support.ClassPathXmlApplicationContext;??
??
import?com.bird.service.PersonServer;??
??
public?class?SpringAOPTest?{??
??????
????@Test??
????public?void?inteceptorTest(){??
????????ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext("beanAop.xml");??
????????PersonServer?bean?=?(PersonServer)ctx.getBean("personServiceBean");??
????????bean.save(null);??
????}??
??????
??
}??
測(cè)試結(jié)果為
[java]?view plain?copy?print?
2012-3-12?18:08:39?org.springframework.context.support.AbstractApplicationContext?prepareRefresh??
信息:?Refreshing?org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6:?display?name?[org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6];?startup?date?[Mon?Mar?12?18:08:39?CST?2012];?root?of?context?hierarchy??
2012-3-12?18:08:40?org.springframework.beans.factory.xml.XmlBeanDefinitionReader?loadBeanDefinitions??
信息:?Loading?XML?bean?definitions?from?class?path?resource?[beanAop.xml]??
2012-3-12?18:08:40?org.springframework.context.support.AbstractApplicationContext?obtainFreshBeanFactory??
信息:?Bean?factory?for?application?context?[org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]:?org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7??
2012-3-12?18:08:40?org.springframework.beans.factory.support.DefaultListableBeanFactory?preInstantiateSingletons??
信息:?Pre-instantiating?singletons?in?org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7:?defining?beans?[org.springframework.aop.config.internalAutoProxyCreator,personServiceBean,myInterceptor];?root?of?factory?hierarchy??
null??
前置通知??
進(jìn)入環(huán)繞通知??
我是save方法??
后置通知??
退出方法??
最終通知??