-
Bean的生命周期-初始化
查看全部 -
Spring官网对Bean的作用域解释
查看全部 -
Bean的作用域
查看全部 -
Bean的常用配置项
查看全部 -
Advice扩展
一、给advice传递参数
【a】方式一:在通知注解里写参数,通过&& args(参数名,..)传入参数,该参数可以是自己定义的类型,也可以为String等类型。(通常获取参数,进行一些判断或者日志的记录)
【a】方式二:切入点和通知分开写的方式,在切入点注解里写参数,在通知注解里引用切入点注解的方法名。
【b】运行时,生效的一个注解,这两个注解修饰在方法上,在通知注解里通过&& @annotation(运行时注解修饰的方法名,首字母小写),如果某个方法使用了运行时注解,则一定会给value()附一个值,在通知方法里可以通过方法参数,调用该方法得到该值(一般记录该注解用了哪些方法,或者用在判断该方法上是否加了某注解,后者判断获取到的值是哪值)
查看全部 -
Spring的设值注入
查看全部 -
Spring的注入
查看全部 -
Advice定义及实例(AspectJ中advice的定义)
一、Before advice:对于切面类使用@Aspect修饰类,相当于<aop:aspect>配置,在方法上添加@Before(“execution(* com.imooc.aop.aspectj.biz.*Biz.*(..))”),相当于<aop:before>标签,@Component修饰类,省略了配置<bean>标签。
案例(前置通知):
步骤1:业务方法
public class MoocBiz {
public void print(){
System.out.println("业务方法执行了");
}
}
步骤2:切面方法
@Aspect
public class MoocAspect {
@Before("execution(* *Biz.*(..))")
public void beforeAdvice(){
System.out.println("前置通知方法执行了");
}
}
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();
}
结果:
前置通知方法执行了
业务方法执行了
可以定义共享的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("前置通知方法执行了");
}
}
二、After returning advice
和前置通知相似。
有时候需要在通知体内得到返回的实际值,可以使用@AfterReturning绑定返回值的形式,如果知道返回值类型可以写类型,如果不知道,可以写Object。
后置通知案例:
public class MoocBiz {
public void print(){
System.out.println("业务方法执行了");
}
}
@Aspect
public class MoocAspect {
@Pointcut("execution(* *Biz.*(..))")
public void pointcut(){
}
@Before("pointcut()")
public void beforeAdvice(){
System.out.println("前置通知方法执行了");
}
@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>
结果:
前置通知方法执行了
业务方法执行了
AfterReturning:null
三、After throwing advice
有时候需要在通知体内得到异常的实际值,可以使用@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("业务方法执行了");
throw new RuntimeException("运行时异常");
}
}
结果:
前置通知方法执行了
业务方法执行了
异常:运行时异常
四、After(finally)advice
最终通知必须准备处理正常和异常两种返回情况,它通常用于释放资源。(类似于try-catch中finally的功能)
@After("pointcut()")
public void afterAdvice(){
System.out.println("后置通知执行了");
}
前置通知方法执行了
业务方法执行了
后置通知执行了
异常:运行时异常
五、环绕通知(Around Advice)
1、环绕通知使用@Around注解来声明,通知方法的第一个参数必须是ProceedingJoinPoint类型
2、在通知方法内部会调用ProceedingJoinPoint的proceed()方法会导致执行真正的方法,同时可以传入一个Object[]对象,数组中的值将被作为参数传递给方法。
案例:
@Around("pointcut()")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("环绕前置通知方法执行了========");
Object o=pjp.proceed();
System.out.println("环绕后置通知方法执行了========");
return o;
}
结果:
环绕前置通知方法执行了========
前置通知方法执行了
业务方法执行了
环绕后置通知方法执行了========
后置通知执行了
AfterReturning:null
查看全部 -
Bean容器初始化
查看全部 -
Bean容器初始化
查看全部 -
单元测试类的
查看全部 -
Spring的Bean配置
查看全部 -
IOC的扩展理解
查看全部 -
什么是IOC?
查看全部 -
面向接口编程
查看全部
举报