Solon v3.0.2

@Addition 使用说明(AOP)

</> markdown

这是一个 Web Aop 的注解(替代之前的 @Before@After

1、Action 内部结构详图

完整的Web《请求处理过程示意图》。其中 Action (即 Controller 里的执行动作)内部结构图:

@Addition 即应用在 “FilterChain” 处位置(为 Action 附加局部过滤器)。

2、关于过滤器的 "全局"、"局部"

  • 全局控制(对所有请求有效):
public class App{
    public static void main(String[] args){
        Solon.start(App.class, args, app->{
            app.filter(new WhitelistFilter());
        });
    }
}
  • 局部控制。且只作用在 Action 或 Controller 上。
@Controller
public class UserController{
    @Addition(WhitelistFilter.class)
    @Mapping("/user/del")
    public void userDel(){ }
}

4、应用示例:局部请求白名单控制(Before)

定义白名单处理器

public class WhitelistFilter implements Filter{
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        //bef do...
        chain.doFilter(ctx);
    }
}

使用 @Addition 进行附加(在 Action 的 method 执行之前,此时 method 的参数未解析。如果提前档住算是省性能了

@Controller
public class DemoController{
    //删除比较危险,加个白名单检查
    @Addition(WhitelistFilter.class)
    @Mapping("user/del")
    public void delUser(..){
    }
}

可以使用"注解继承"模式,用起来简洁些

//将 @Addition 附加在 Whitelist 注解上;@Whitelist 就代表了 @Addition(WhitelistFilter.class)
@Addition(WhitelistFilter.class)
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Whitelist {
}


@Controller
public class DemoController{
    @Whitelist
    @Mapping("user/del")
    public void delUser(..){
    }
}

5、应用示例:局部请求日志记录(After)

定义日志处理器

public class LoggingFilter implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        chain.doFilter(ctx);
        
        //aft do
        System.out.println((String) ctx.attr("output"));
    }
}

可以使用"注解继承"模式,用起来简洁些

@Addition(LoggingFilter.class)
@Target({ElementType.METHOD, ElementType.TYPE}) //支持加在类或方法上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Logging {
}


@Controller
public class DemoController{
    @Logging
    @Mapping("user/del")
    public void delUser(..){
    }
}

关于这个能力,也可以参考:《统一的局部请求日志记录(即带注解的)》