在 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 執行。