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