如何访问单例并在 java 中命名?

How to access a singleton and name it in java?

我想在 Java 中创建一个单例,它需要从文件配置中读取以实例化,以及其他逻辑(因此它不仅仅是一个新的 MySingletonObject())。

在 Spring 中实现该目标的正确方法是什么?我想知道我是否应该执行以下操作:

public interface MySingletonObjectAccessor {
  MySingletonObject getInstance();
}

@Service
public class MySingletonObjectAccessorImpl implements MySingletonObjectAccessor {
  private MySingletonObject mySingletonObject;
  @Override
  public MySingletonObject getInstance() {
    return mySingletonObject;
  }

  MySingletonObjectAccessorImpl() {
    this.MySingletonObject = // complex logic here, that includes reading from a config file

  }
}

用法将是:

@Autowired
MySingletonObjectAccessor msoa;

MySingletonObject mso = msoa.getInstance();

我走在正确的轨道上吗?如果是这样,MySingletonObjectAccessor 服务的正确命名约定是什么?

您可以定义一个 Bean 并添加一个范围使其成为单例。

    @Configuration
    class MySingletonBeanConfiguration {

      //default is singleton scope
      @Bean
      public MySingletonBean mySingletonBean() {
        return new MySingletonBean();
      }
    }

如果您使用单例作为配置,则使用 @Component 并使用 @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) 作为单例。

如果配置文件使用 FileConfig 作为 class 名称,根据 java 标准 class 名称必须指定它有什么以及它能做什么。例如:- FileReadConfig、FileUploadConfig、DBConnectConfig、EagerInitializedSingleton、StaticBlockSingleton、EnumSingleton ....,

示例:-

@Configuration
public class MySingletonObject {
   private MySingletonObject mySingletonObject;
   public static final String FILENAME = "/Users/xxx/Projects/xxx/config.xml";
   private XMLObject config = null;

    private boolean loadConfig(String fileName) {
        BufferedReader reader;
        String line;
        String content = "";

        try {
            reader = new BufferedReader(new FileReader(fileName));

            while ((line = reader.readLine()) != null) {
                content += line;
            }
        } catch (IOException ex) {
            LOGGER.log(Level.SEVERE, null, ex);
            return false;
        }

        /**
         * IF there is no content, the file must not be valid
         */
        if (content.length() <= 0) {
            return false;
        }
        this.config = new XMLObject(content);

        return true;
    }
    private Configuration() {
        boolean result = this.loadConfig(FILENAME);

        if (!result) {
            if (!this.createConfig(FILENAME)) {
                System.exit(0); //Catastrophic
            }
        }else{
            mySingletonObject = new MySingletonObject ();
        }
    }

   @Bean("mySingletonObject")
   @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
   public MySingletonObject getMySingletonObject () {
      return mySingletonObject;
   }
}

现在

@Autowired
MySingletonObject msoa;

您可以在 Spring 扫描的包裹中有这样的 public 配置 class:

@Configuration
public class MySingletonProvider {

  @Bean
  public MySingleton nameTheMethodExactlyLikeTheBeanNameYouWant(@Value("${singleton.xml.file}") String xmlConfigFile) {
    Library lib = new Library(xmlConfigFile);
    return new MySingleton(lib);
  }
}