Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以在服务bean中有公共静态字段吗?_Java_Spring_Oop - Fatal编程技术网

Java 我可以在服务bean中有公共静态字段吗?

Java 我可以在服务bean中有公共静态字段吗?,java,spring,oop,Java,Spring,Oop,我对这段代码有点怀疑,因为它有点违反了YAGNI。我需要为我的服务类提供一些公共静态字段,但通常情况下,当您的服务bean中有这些字段时,这是一个糟糕的设计,因此我为该服务创建了一个接口,但我不确定这是正确的选择。我应该在服务类中包含这些字段吗 公共接口IYouTubeServiceBuild{ /** *定义HTTP传输的全局实例。 */ 公共静态最终HttpTransport HTTP_TRANSPORT=新的NetHttpTransport; /** *定义JSON工厂的全局实例。 */

我对这段代码有点怀疑,因为它有点违反了YAGNI。我需要为我的服务类提供一些公共静态字段,但通常情况下,当您的服务bean中有这些字段时,这是一个糟糕的设计,因此我为该服务创建了一个接口,但我不确定这是正确的选择。我应该在服务类中包含这些字段吗

公共接口IYouTubeServiceBuild{ /** *定义HTTP传输的全局实例。 */ 公共静态最终HttpTransport HTTP_TRANSPORT=新的NetHttpTransport; /** *定义JSON工厂的全局实例。 */ 公共静态最终JsonFactory JSON_工厂=新杰克森工厂; /** *定义一个全局变量,该变量标识 *包含开发人员的API密钥。 */ 公共静态最终字符串属性\u FILENAME=youtube.PROPERTIES; } @服务 @Scopevalue=ConfigurableBeanFactory.SCOPE\u SINGLETON 公共类YouTubeServiceBuild实现IYouTubeServiceBuild{ @吸气剂 私人物业;; /** *定义将要使用的Youtube对象的全局实例 *发出YouTube数据API请求。 */ @吸气剂 私人YouTube; @施工后 公共无效初始{ 属性=新属性; youtube=新建youtube.BuilderHTTP_传输,JSON_工厂,请求->{ }.setApplicationNameyoutube-search-demo.build; //等等。。。 } } } 然后,在其他服务中使用上述服务类别,如下所示:

@服务 公共类YouTubeAservice{ @自动连线 私有YouTube服务构建服务构建; 公共列表搜索Subestring searchQuery{ 列出搜索结果= executeSearchsearchQuery、serviceBuild.getProperties、serviceBuild.getYoutube; //等等。。。 }
如果问题是是否可以在SpringManagedBean中设置公共静态字段,那么是的,这是可能的,尽管我完全同意您的观点,这是一个糟糕的设计

抛开spring不谈,在接口中放置常量以便接口的实现能够访问它们被认为是一种代码味道,因为所有假设有许多常量的实现现在都可以表现不同,因为一些常量更改,甚至更糟糕的是,如果删除常量,将不再编译,如果没有呢t所有的实现都在项目中

更好的方法是创建一类常量:

 public class YouTubeConstants {
    public static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
    public static final JsonFactory JSON_FACTORY = new JacksonFactory();
    ...
 }
在需要访问这些常量的类中,可以使用YouTubeConstants.HTTP_传输,甚至可以使用静态导入进行短路

现在,关于所提出的设计,让我提出一个备选方案:

YouTubeAppiservice类基本上只需要访问YouTube对象,它需要它来执行查询。不需要YouTubeServiceBuild中间对象,不需要连接属性,这只会使代码复杂化

您可以这样做:

 @Service
 public class YouTubeApiService {
    @Autowired
    private YouTube youtube;

     public List<SearchResult> searchYouTube(String searchQuery) {
         List<SearchResult> searchResults =
            executeSearch(searchQuery,youtube);
         //etc...
     }
 } 
在这个实现中,根本不需要YouTubeBuilder

还有一件事需要考虑: 看起来您试图自己加载一些属性,注意,spring可以单独加载


我在问题中的代码中没有看到这些属性的任何实际用法,因此我无法提供工作示例,但请确保您了解如何在spring中加载属性,您可能会将已加载的属性注入配置中的youtube方法。

您的初始语句是错误的。您不需要c服务bean中的常量字段。您需要从这些共享资源创建bean,并将它们连接到所需的位置。这就是使用DI框架的全部意义——因此使用IoC模式构建软件。此外,即使您确实需要这些常量字段,您也绝对不需要重新创建常量接口模式rn@BoristheSpider好的,我删除了接口,现在有两个处理YouTube api的服务bean,一个在启动时加载,另一个在用户搜索时调用。这两个类都需要一些常量,一个在应用程序启动时,另一个在用户搜索时。我在中声明了所有这些常量一个单独的类*Constants.java。这样可以吗?现在这些服务直接调用这个Constants类,这感觉不太对。@Boristeider回复第二条评论谢谢你的真诚建议,真的:我对Spring没有太多经验,已经在Action 5中阅读了Spring的一半,构建了一些CRUD项目,在进入下半部分之前[webflux、反应式编程等]目前,我专注于真正理解如何正确使用我已经知道的关于spring boot的知识,而不仅仅是编写一个有效的代码。谢谢,这似乎是一个完美的解决方案。YouTube配置直接与YouTube实例通信可以吗?我可以将这些常量添加到YouTube实例并删除YouTube实例吗?可以吗
我在application.properties中定义YouTubeAppikeyProperty?我在searchExecute方法中需要这个apiKey。两种方法都可以,我可以摆脱YoutubeConstants。将这些常量声明为bean。自动连线。Spring应用程序中的任何地方都不应该有公共静态,除非后面跟着类。
 import static YoutubeConstants.*;
 @Configuration
 public class YouTubeConfig {

    @Bean
    public YouTube youtube() {
      return new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, request -> {
         }).setApplicationName("youtube-search-demo").build();
    }
 }