@Cacheable на неуправляемом классе - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно использовать ehcache в неуправляемом классе, например в служебном классе.Это не работает.Я попытался инициализировать объект служебного класса, но все равно не повезло.Причина, по которой я собираюсь создать объект, заключается в том, что этот конкретный класс не может быть одноэлементным объектом, поскольку этот класс имеет некоторые другие переменные класса, значения которых отличаются от других объектов того же класса.Поэтому я не могу аннотировать этот класс с помощью @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;
    }
}

1 Ответ

0 голосов
/ 14 мая 2018

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

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

4.4.2 Область действия прототипа

Не единственная прототипная область развертывания bean-компонента приводит к созданию нового экземпляра bean-компонента каждый раз, когда делается запрос для этого конкретного bean-компонента (то есть он внедряется в другой bean-компонент или запрашивается через программный getBean () вызов метода на контейнере).Как правило, вы должны использовать область действия прототипа для всех bean-компонентов с состоянием, в то время как единственная область должна использоваться для bean-компонентов без состояния.

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

@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 "";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...