package com.example.aop; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * Created by liz19 on 2017/1/30. */ @Target(ElementType.METHOD) @Retention(RUNTIME) @Documented public @interface Action { String name(); }
package com.example.aop; import org.springframework.stereotype.Service; /** * Created by liz19 on 2017/1/30. */ @Service public class DemoAnnotationService { @Action(name="注解式拦截的add操作") public void add(){ System.out.println("clas DemoAnnotationService"); } }
package com.example.aop; import org.springframework.stereotype.Service; /** * Created by liz19 on 2017/1/30. */ @Service public class DemoMethodService { public void add(){ System.out.println("class DemoMethodService"); } }
package com.example.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.Method; /** * Created by liz19 on 2017/1/30. */ @Aspect @Component public class LogAspect { @Pointcut("@annotation(com.example.aop.Action)") public void annotationPointCut(){} @After("annotationPointCut()") public void after(JoinPoint joinPoint){ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Action action = method.getAnnotation(Action.class); System.out.println("注解式拦截--------Name: "+action.name()); } @Before("execution(* com.example.aop.DemoMethodService.*(..))") public void before(JoinPoint joinPoint){ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); System.out.println("方法规则拦截拦截---------"+ method.getName()); } }
package com.example; import com.example.aop.AopConfig; import com.example.aop.DemoAnnotationService; import com.example.aop.DemoMethodService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * Created by liz19 on 2017/1/30. */ public class AopApp { public static void main(String[] args){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); DemoAnnotationService demoAnnotationService = context.getBean(DemoAnnotationService.class); DemoMethodService demoMethodService = context.getBean(DemoMethodService.class); demoAnnotationService.add(); demoMethodService.add(); context.close(); } }
package com.example.aop; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * Created by liz19 on 2017/1/30. */ @Configuration @ComponentScan("com.example.aop") @EnableAspectJAutoProxy public class AopConfig { }
1.通过@Aspect注解声明一个切面
2.通过@Component让此切面成为Spring容器管理的Bean
3.通过@PointCut注解声明切点
4.通过@After注解声明一个建言,并用@PointCut定义的切点
5.通过发射获得注解上的属性,然后做日志记录的相关操作,下面的相同
6.通过@Before注解声明一个建言,此建言直接使用拦截规则作为参数
7.通过@EnableAspectJAutoProxy开启对AspectJ支持
时间: 2024-10-11 02:46:04