@Cacheable в управляемом классе, отличном от Spring

Мне нужно использовать ehcache для управляемого класса, отличного от Spring, например служебного класса. Это не работает. Я попытался инициализировать объект служебного класса, но все равно не повезло. Причина, по которой я собираюсь создать объект, заключается в том, что этот конкретный класс не может быть одноэлементным объектом, потому что этот класс имеет некоторые другие переменные класса, значения которых отличаются от других объектов того же класса. Поэтому я не могу аннотировать этот класс с помощью @Component

Класс полезности

public class DirectoryReader implements IReader {

    // Some other class variables, which values are different from other object of same class Ex. Delete the file after read.
    private boolean deleteFilesAfterRead;
    @Cacheable(cacheNames = "directoryContent", unless = "#result.length() > 0")
    public String getContent() {
        //Read a file and get data;
        return "";
    }
}

Создание объекта

@Component
public class ReaderUtility {
    @Autowired
    ApplicationContext applicationContext;
    @Bean(name = "readers")
    public List<IReader> determineReader() {
        DirectoryReader directoryReader1 = new DirectoryReader();
        DirectoryReader directoryReader2 = new DirectoryReader();
        applicationContext.getAutowireCapableBeanFactory().initializeBean(directoryReader1, "directoryReader1");
        applicationContext.getAutowireCapableBeanFactory().initializeBean(directoryReader2, "directoryReader2");
        // List<IReader> readers = .....
        // return readers;
    }
}
«Причина, по которой я собираюсь создать объект, заключается в том, что этот конкретный класс не может быть одноэлементным объектом, потому что этот класс имеет некоторые другие методы и переменную класса, которые отличаются от других объектов того же класса». В этом нет никакого смысла. Если у них разные методы и поля, это не один и тот же класс.
SeverityOne 13.05.2018 18:32

@SeverityOne Я обновлю вопрос, я имел в виду другое значение поля.

Pasupathi Rajamanickam 13.05.2018 18:44

Spring необходимо проксировать объекты, в которых вы хотите использовать их функциональность. Вы можете пересмотреть структуру своего кода, чтобы переместить @Cachable в управляемый компонент.

Somasundaram Sekar 13.05.2018 19:17

@SomasundaramSekar Понятно, но не уверен, поддерживает ли Spring несколько bean-компонентов для одного и того же класса. Если так, я могу это использовать. Любая идея?

Pasupathi Rajamanickam 13.05.2018 23:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
324
1

Ответы 1

Если проблема заключается в создании синглтона, почему бы не использовать @Scope("prototype"), чтобы новый bean-компонент создавался с каждым запросом? Это то, что вы должны делать для bean-компонентов с отслеживанием состояния, как в вашем случае.

https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype

4.4.2 The prototype scope

The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance every time a request for that specific bean is made (that is, it is injected into another bean or it is requested via a programmatic getBean() method call on the container). As a rule of thumb, you should use the prototype scope for all beans that are stateful, while the singleton scope should be used for stateless beans.

Затем вы можете обновить свой служебный класс до следующего:

@Component
@Scope("prototype")
public class DirectoryReader implements IReader {

    // Some other class variables, which values are different from other object of same class Ex. Delete the file after read.
    private boolean deleteFilesAfterRead;
    @Cacheable(cacheNames = "directoryContent", unless = "#result.length() > 0")
    public String getContent() {
        //Read a file and get data;
        return "";
    }
}

Другие вопросы по теме