方法攔截(AOP)
YMP框架的AOP是基於CGLIB的MethodInterceptor實現的攔截,透過以下註解進行配置:
@Before:用於設定一個類別或方法的前置攔截器,宣告在類別上的前置攔截器將被應用到該類別所有方法上;
@After:用於設定一個類別或方法的後置攔截器,聲明在類別上的後置攔截器將被應用到該類別所有方法上;
#@Clean:用於清理類別上全部或指定的攔截器,被清理的攔截器將不會被執行;
@ContextParam:用於設定上下文參數,主要用於傳遞參數配置給攔截器;
@Ignored:宣告一個方法將忽略一切攔截器配置;
範例一:說明:
##宣告@Ignored註解的方法、非公有方法和Object類別方法及Object類別重載方法將不被攔截器處理。
// 创建自定义拦截器 public class DemoInterceptor implements IInterceptor { public Object intercept(InterceptContext context) throws Exception { // 判断当前拦截器执行方向 switch (context.getDirection()) { // 前置 case BEFORE: System.out.println("before intercept..."); // 获取拦截器参数 String _param = context.getContextParams().get("param"); if (StringUtils.isNotBlank(_param)) { System.out.println(_param); } break; // 后置 case AFTER: System.out.println("after intercept..."); } return null; } } @Bean public class TestDemo { @Before(DemoInterceptor.class) public String beforeTest() { return "前置拦截测试"; } @After(DemoInterceptor.class) public String afterTest() { return "后置拦截测试"; } @Before(DemoInterceptor.class) @After(DemoInterceptor.class) @ContextParam({ @ParamItem(key = "param", value = "helloworld") }) public String allTest() { return "拦截器参数传递"; } public static void main(String[] args) throws Exception { YMP.get().init(); try { TestDemo _demo = YMP.get().getBean(TestDemo.class); _demo.beforeTest(); _demo.afterTest(); _demo.allTest(); } finally { YMP.get().destroy(); } } }
@Bean @Before(DemoInterceptor.class) @ContextParam({ @ParamItem(key = "param", value = "helloworld") }) public class TestDemo { public String beforeTest() { return "默认前置拦截测试"; } @After(DemoInterceptor.class) public String afterTest() { return "后置拦截测试"; } @Clean public String cleanTest() { return "清理拦截器测试"; } public static void main(String[] args) throws Exception { YMP.get().init(); try { TestDemo _demo = YMP.get().getBean(TestDemo.class); _demo.beforeTest(); _demo.afterTest(); _demo.cleanTest(); } finally { YMP.get().destroy(); } } }
註:@ContextParam註解的value屬性允許透過$xxx的格式支援從框架全域參數中取得xxx的值