-
Bean的生命周期-初始化
查看全部 -
Spring官網(wǎng)對Bean的作用域解釋
查看全部 -
Bean的作用域
查看全部 -
Bean的常用配置項
查看全部 -
Advice擴展
一、給advice傳遞參數(shù)
【a】方式一:在通知注解里寫參數(shù),通過&& args(參數(shù)名,..)傳入?yún)?shù),該參數(shù)可以是自己定義的類型,也可以為String等類型。(通常獲取參數(shù),進行一些判斷或者日志的記錄)
【a】方式二:切入點和通知分開寫的方式,在切入點注解里寫參數(shù),在通知注解里引用切入點注解的方法名。
【b】運行時,生效的一個注解,這兩個注解修飾在方法上,在通知注解里通過&& @annotation(運行時注解修飾的方法名,首字母小寫),如果某個方法使用了運行時注解,則一定會給value()附一個值,在通知方法里可以通過方法參數(shù),調(diào)用該方法得到該值(一般記錄該注解用了哪些方法,或者用在判斷該方法上是否加了某注解,后者判斷獲取到的值是哪值)
查看全部 -
Spring的設(shè)值注入
查看全部 -
Spring的注入
查看全部 -
Advice定義及實例(AspectJ中advice的定義)
一、Before advice:對于切面類使用@Aspect修飾類,相當(dāng)于<aop:aspect>配置,在方法上添加@Before(“execution(* com.imooc.aop.aspectj.biz.*Biz.*(..))”),相當(dāng)于<aop:before>標(biāo)簽,@Component修飾類,省略了配置<bean>標(biāo)簽。
案例(前置通知):
步驟1:業(yè)務(wù)方法
public class MoocBiz {
public void print(){
System.out.println("業(yè)務(wù)方法執(zhí)行了");
}
}
步驟2:切面方法
@Aspect
public class MoocAspect {
@Before("execution(* *Biz.*(..))")
public void beforeAdvice(){
System.out.println("前置通知方法執(zhí)行了");
}
}
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.xsd ?
? ? ? ? http://www.springframework.org/schema/context
? ? ? ? http://www.springframework.org/schema/context/spring-context.xsd
? ? ? ? http://www.springframework.org/schema/aop?
? ? ? ? http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="src"></context:component-scan>
<bean id="moocBiz" class="MoocBiz"></bean>
<bean id="moocAspect" class="MoocAspect"></bean>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
測試:
@Test
public void testMooc(){
ApplicationContext ac=new ClassPathXmlApplicationContext("spring-ioc2.xml");
MoocBiz mb=(MoocBiz) ac.getBean("moocBiz");
mb.print();
}
結(jié)果:
前置通知方法執(zhí)行了
業(yè)務(wù)方法執(zhí)行了
可以定義共享的pointcut(一個方法上使用@Pointcut("execution(* com.imooc.aop.aspectj.biz.*Biz.*(..))"),然后@Before("pointcut()")修飾另一個方法上
@Aspect
public class MoocAspect {
@Pointcut("execution(* *Biz.*(..))")
public void pointcut(){
}
@Before("pointcut()")
public void beforeAdvice(){
System.out.println("前置通知方法執(zhí)行了");
}
}
二、After returning advice
和前置通知相似。
有時候需要在通知體內(nèi)得到返回的實際值,可以使用@AfterReturning綁定返回值的形式,如果知道返回值類型可以寫類型,如果不知道,可以寫Object。
后置通知案例:
public class MoocBiz {
public void print(){
System.out.println("業(yè)務(wù)方法執(zhí)行了");
}
}
@Aspect
public class MoocAspect {
@Pointcut("execution(* *Biz.*(..))")
public void pointcut(){
}
@Before("pointcut()")
public void beforeAdvice(){
System.out.println("前置通知方法執(zhí)行了");
}
@AfterReturning(pointcut="pointcut()",returning="o")
public void afterAdvice(Object o){
System.out.println("AfterReturning:"+o);
}
}
<context:component-scan base-package="src"></context:component-scan>
<bean id="moocBiz" class="MoocBiz"></bean>
<bean id="moocAspect" class="MoocAspect"></bean>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
結(jié)果:
前置通知方法執(zhí)行了
業(yè)務(wù)方法執(zhí)行了
AfterReturning:null
三、After throwing advice
有時候需要在通知體內(nèi)得到異常的實際值,可以使用@AfterReturning綁定返回值的形式
案例:
@AfterThrowing(pointcut="pointcut()",throwing="t")
public void afterThrowAdvice(RuntimeException t){
System.out.println("異常:"+t.getMessage());
}
public class MoocBiz {
public void print(){
System.out.println("業(yè)務(wù)方法執(zhí)行了");
throw new RuntimeException("運行時異常");
}
}
結(jié)果:
前置通知方法執(zhí)行了
業(yè)務(wù)方法執(zhí)行了
異常:運行時異常
四、After(finally)advice
最終通知必須準(zhǔn)備處理正常和異常兩種返回情況,它通常用于釋放資源。(類似于try-catch中finally的功能)
@After("pointcut()")
public void afterAdvice(){
System.out.println("后置通知執(zhí)行了");
}
前置通知方法執(zhí)行了
業(yè)務(wù)方法執(zhí)行了
后置通知執(zhí)行了
異常:運行時異常
五、環(huán)繞通知(Around Advice)
1、環(huán)繞通知使用@Around注解來聲明,通知方法的第一個參數(shù)必須是ProceedingJoinPoint類型
2、在通知方法內(nèi)部會調(diào)用ProceedingJoinPoint的proceed()方法會導(dǎo)致執(zhí)行真正的方法,同時可以傳入一個Object[]對象,數(shù)組中的值將被作為參數(shù)傳遞給方法。
案例:
@Around("pointcut()")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("環(huán)繞前置通知方法執(zhí)行了========");
Object o=pjp.proceed();
System.out.println("環(huán)繞后置通知方法執(zhí)行了========");
return o;
}
結(jié)果:
環(huán)繞前置通知方法執(zhí)行了========
前置通知方法執(zhí)行了
業(yè)務(wù)方法執(zhí)行了
環(huán)繞后置通知方法執(zhí)行了========
后置通知執(zhí)行了
AfterReturning:null
查看全部 -
Bean容器初始化
查看全部 -
Bean容器初始化
查看全部 -
單元測試類的
查看全部 -
Spring的Bean配置
查看全部 -
IOC的擴展理解
查看全部 -
什么是IOC?
查看全部 -
面向接口編程
查看全部
舉報