2021SC@SDUSC
目录
2.WechatAddonConfig&WechatAddonInfo
Interceptor 可以对方法进行拦截,并提供机会在方法的前后添加切面代码,实现 AOP 的核心目标。Interceptor 接口仅仅定义了一个方法 public void intercept(Invocation inv)。
以上代码中的 DemoInterceptor 将拦截目标方法,并且在目标方法调用前后进行自定义的操作。inv.invoke() 这一行代码是对目标方法的调用,在这一行代码的前后插入切面代码可以很方便地实现AOP。注意必须调用 inv.invoke() 方法,才能将当前调用传递到后续的 Interceptor 与 Action。
确保调用 inv.invoke() 方法。一般来说,常见错误有如下:目前为止仍有很多同学忘了调用 inv.invoke() 方法,造成 controller 中的 action 不会被执行。在此再次强调一次,一定要调用一次 inv.invoke(),除非是刻意不去调用剩下的拦截器与 action,这种情况仍然需要使用 inv.getController().render()/renderJson() 调用一下相关的 render() 方法为客户端响应数据。
注意保护Interceptor 中的属性。Interceptor 是全局共享的,所以如果要在其中使用属性需要保证其属性是线程安全的。Interceptor 类的属性将会被多线程访问到,从而引发线程安全问题。一般来说,Interceptor 的属性大部分使用public static final String 来定义就行。
core.wechat为JPress核心包下处理微信业务的插件。
WechatAddonManager类实现了JbootEventListener接口。WechatAddonManager类本身使用饿汉式单例
WechatAddonManager在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
好处是没有线程安全的问题,坏处是浪费内存空间。浪费内存空间是因为一开始就实例化了,系统资源开销大。
WechatAddonManager主要的功能是对插件(所有插件、已经启用的插件)的管理。在微信插件管理器中有增、添、改、查、关闭、开启插件方法。
微信插件的注解。定义如下:
@Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface WechatAddonConfig { String id(); String title(); String description() default ""; String author() default ""; String authorWebsite() default ""; String version() default "v1.0.0"; int versionCode() default 1; }
@Inherited:子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。
@Target({ElementType.TYPE}):类,接口(包括注解类型)或枚举的声明。
@Retention(RetentionPolicy.RUNTIME):注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到。
WechatAddonInfo类的属性与微信插件的注解一致,用于存储微信插件对象。
WechatAddon定义了微信插件的接口,实现该接口的插件类都要重写一下俩方法:onMatchingMessage、onRenderMessage。用来匹配是否由该插件执行以及执行回复逻辑。
public interface WechatAddon { public boolean onMatchingMessage(InMsg inMsg, MsgController msgController); public boolean onRenderMessage(InMsg inMsg, MsgController msgController); }