Как получить доступ к синглтону и назвать его в java? - PullRequest
0 голосов
/ 30 января 2020

Я хочу создать синглтон в Java, который требует чтения из конфигурации файла для создания инстанции, среди прочих логи c (так что это не просто новый MySingletonObject ()).

Что правильно способ добиться этого весной? Мне было интересно, если я должен сделать следующее:

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?

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Вы можете определить Бин и добавить область действия, чтобы сделать его синглтоном.

    @Configuration
    class MySingletonBeanConfiguration {

      //default is singleton scope
      @Bean
      public MySingletonBean mySingletonBean() {
        return new MySingletonBean();
      }
    }
0 голосов
/ 30 января 2020

В ваших пакетах, отсканированных с помощью Spring, вы можете иметь следующий класс конфигурации c:

@Configuration
public class MySingletonProvider {

  @Bean
  public MySingleton nameTheMethodExactlyLikeTheBeanNameYouWant(@Value("${singleton.xml.file}") String xmlConfigFile) {
    Library lib = new Library(xmlConfigFile);
    return new MySingleton(lib);
  }
}
0 голосов
/ 30 января 2020

Если вы используете singleton в качестве конфигурации, тогда используйте @Component и @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) для singleton.

Если вы настраиваете файл, используйте FileConfig в качестве имени класса согласно java имени класса стандартов Необходимо указать, что он имеет и что он может сделать. Пример: - 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;
...