Solon2 常用注解之 @ProxyComponent 用法说明

发布时间 2023-04-19 08:04:56作者: 带刺的坐椅

在 Solon 提倡“克制”的原则下,托管组件分为:

之所以需要代理,是为了能拦截函数;之所以需要拦截函数,是为了让函数上的注解生效。也算是 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 执行。