我怎样才能让吸气的电话在同一类强制性

问题描述 投票:0回答:2

我有这样的代码:我如何才能让使用的getService()方法在GETALL梅索德强制性的,这意味着如果我直接打电话service.findAll()编译失败?

是否有可能创建一个注释,禁止直接使用的字段?

@Named
@Profile("default")
public class AlfrescoVersionServiceImpl  {

   @Inject
   //Request Scope service
   private AlfrescoService service;

   @Resource
   private WebServiceContext webServiceContext;


   public List<Fichier> getAll(){
       return getService().findAll();
   }


   public AlfrescoService getService(){
       service.setEnPointAdress("--");
       if(webServiceContext.isUserInRole(role)){
           service.setRole("--");
       }
   }


}

预先感谢您的回复。

java java-ee design-patterns annotations java-7
2个回答
1
投票

您可以在service区域移动到一个超类,并声明其private防止子类进行访问,同时保持getService() protected

另外,您也可以配置在AlfrescoService方法@Produces,所以大家要求被注入的AlfrescoService获取已配置的实例。


1
投票

里面findAll()你可以使用Thread.getStackTrace()检查当前的堆栈跟踪并确保以前的StackTraceElement是你想要的类和方法:

public List<Fichier> findAll() {
    StackTraceElement[] stack = Thread.getStackTrace();
    if(stack.length > 1) {
         // stack[0] is ourselves, stack[1] is who called us
         if(stack[1].getClassName().equals(...) && stack[1].getMethodName().equals(...) {
             // execute the business logic
         } 
    }
}

只是要注意的几件事情:

  • 这是一个运行时检查,因此调用findAll()方法不会在编译时被标记。
  • 根据JavaDocs,所述getStackTrace()方法可能不被一些SecurityManagers允许的,并且某些VM可能在罕见的情况下省略堆栈帧。
  • 如果你为每个请求做到这一点,这可能不是高性能。
  • 如果该服务是一个Spring bean,你可能要面对通过代理类排序,以找到真正的调用者(即以前的堆栈帧之前findAll()可以是弹簧产生的代理类)。

另一种方法是使用一个面向方面的框架。例如,Spring AOP具有可用于匹配呼叫者姓名,班级,和包ControlFlowPointcut。这种方法是多一点的声明,而是依赖于额外的库。

© www.soinside.com 2019 - 2024. All rights reserved.