1. spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能 有注解
1.1 引入 xmlns:context
<context:component-scan base-package="com.bjsxt.advice"></context:component-scan>
2. @Component
2.1 相当于<bean/>
2.2 如果没有参数,把类名首字母变小写,相当于<bean id=""/>
2.3 @Component(“自定义名称”)
3. 实现步骤:
3.1 在 spring 配置文件中设置注解在哪些包中
<context:component-scan base-package="com.bjsxt.advice,com.bjsxt.test"></context:component-scan>
3.2 在 Demo 类中添加@Componet
3.2.1 在方法上添加@Pointcut(“”) 定义切点
@Component
public class Demo {
@Pointcut("execution(* com.bjsxt.test.Demo.demo1())")
public void demo1() throws Exception{
System.out.println("demo1");
}
}
3.3 在通知类中配置
3.3.1 @Component 类被 spring 管理
3.3.2 @Aspect 相当于<aop:aspect/>表示通知方法在当前类中
@Component
@Aspect
public class MyAdvice {
@Before("com.bjsxt.test.Demo.demo1()")
public void mybefore(){
System.out.println("前置");
}
@After("com.bjsxt.test.Demo.demo1()")
public void myafter(){
System.out.println("后置通知");
}
@AfterThrowing("com.bjsxt.test.Demo.demo1()")
public void mythrow(){
System.out.println("异常通知");
}
@Around("com.bjsxt.test.Demo.demo1()")
public Object myarround(ProceedingJoinPoint p) throws Throwable{
System.out.println("环绕-前置");
Object result = p.proceed();
System.out.println("环绕-后置");
return result;
}
}
注意:再配置文件中还需加入
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
本质是使用了cglib动态代理,需要导入cglib的jar包(MyBatis中的lib目录下有)