Spring注解使用
1.基于ASpect
1.1 Spring不会自动去寻找注解,需要自己告诉spring哪个包下可能会有注解
- 引入xmln:context命名空间
<context:component-scan base-package="com.xzj.advice"></context:component-scan>
- @component
该注解相当于
如果没有参数,把类首字母变小写,相当于
@component(“自定义名称”)
1.2实现步骤
- 在spring配置文件中设置注解在哪些包
<context:component-scan
base-package="com.xzj.advice,com.xzj.test"></context:component-scan>
<!--proxy-target-class中
true 代表使用cglib动态代理
flase 代表使用jdk动态代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
- 在Demo中添加@component,相当于bean
在方法上添加@Pointcut注解
@Component("demo")
public class Demo {
@Pointcut("execution(* com.xzj.test.Demo.demo1())")
public void demo1() {
System.out.println("这是Demo1");
}
- 在通知类中配置
@Component表示类被spring管理
@Aspect 相当于aop:aspect/ 表示通知方法在当前类中
@Before、@After、@AfterThrowing、@Around分别为 前置、后置、异常、环绕通知注解。
@Component
@Aspect
public class MyAdvice {
@Before("com.xzj.test.Demo.demo1()")
public void mybefore() {
System.out.println("前置通知");
}
@After("com.xzj.test.Demo.demo1()")
public void myafter() {
System.out.println("后置通知");
}
@AfterThrowing("com.xzj.test.Demo.demo1()")
public void mythrow() {
System.out.println("异常通知");
}
@Around("com.xzj.test.Demo.demo1()")
public Object myaround(ProceedingJoinPoint p) throws Throwable {
System.out.println("环绕前置通知");
Object proceed = p.proceed();
System.out.println("环绕后置通知");
return proceed;
}
}