【资料图】
在 Solon 提倡“克制”的原则下,托管组件分为:
普通组件代理组件(即 @ProxyComponent 注解的类)。代理的细节可以看下《动态代理的本质》 。之所以需要代理,是为了能拦截函数;之所以需要拦截函数,是为了让函数上的注解生效。也算是 AOP 的基础。(如果没有拦截需求,改用 @Component)
如何使用 @ProxyComponent 注解?
1、从替代的角度、或语义的角度使用原来使用 @Service、@Dao、@Repository这三个注解的,或者有这三种语义的类,都用 “@ProxyComponent” 注解。这些类经常会用到事务、或者缓存注解,就会需要函数拦截。使用示例:
@ProxyComponentpublic class UserService{ //...}@ProxyComponentpublic class UserDao{ //...}@ProxyComponentpublic class UserRepository{ //...}
从团队执行规范的管理角度,这个方式比较好,简单:语义对上,就用。
2、从技术的角度使用如果一个类的函数上,使用了“用于拦截的注解”,则使用 “@ProxyComponent” ;如果没有,则使用 “@Component”。比如:
//这个类,虽然也叫 Service,但是函数没有使用“用于拦截的注解”就使用普通组件注解即可。@Componentpublic class ToolService{ public bool isEmpty(String str){ return str=null || str.length()==0; }}//这个类,使用了“用于拦截的注解”,需要使用 "@ProxyComponent"(在函数上加注解,基本上都是拦截目的)@ProxyComponentpublic class UserService{ @Tran public void addUser(UserDo user){ //... }}
从高性能与克制角度,这个方式好。但团队的话,因人员素质差异,可能不好把控细节。
3、补充为什么 “@Controller、@Remoting” 不是动态代理类,也支持函数拦截?因为它们的 Method 被提取并包装成了 MethodWrap。而,所有的函数拦截最终都是由 MethodWrap 执行。
标签: