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支持
