В моем классе SimpleBookRepository я пытаюсь получить доступ к методу экземпляра из аннотации @Cacheable Spring, чтобы определить, использовать ли мне кэширование или нет. Когда я пытаюсь запустить приложение, оно не запускается и сообщает мне:
Описание:
Для компонента требуется компонент с именем SimpleBookRepository, который не может быть найден.
Действие:
Рассмотрите возможность определения bean-компонента с именем SimpleBookRepository в вашей конфигурации.
Это меня очень смущает, потому что приложение отлично работает, когда я удаляю бит условие = "@ SimpleBookRepository.useCache ()". Я бы подумал, что оценка состояния и, следовательно, разрешение бина будут происходить во время выполнения после автопроводки, и было бы невозможно вызвать метод getByIsbn () без существующего бина. Даже когда я явно объявляю bean-компонент в конфигурации, например:
@Bean
public SimpleBookRepository simpleBookRepository(){
return new SimpleBookRepository();
}
Я получаю ту же ошибку.
Я был бы очень признателен, если бы кто-то мог объяснить мне это поведение.
У меня есть следующие классы:
SimpleBookRepository.java
package com.mycompany.app;
@Component
public class SimpleBookRepository implements BookRepository{
@Value("${cache.use}")
private boolean useCache;
public boolean useCache(){
return useCache;
}
@Override
@Cacheable(cacheNames="books", condition = "@SimpleBookRepository.useCache()")
public Book getByIsbn(String isbn){
//Get mock data
}
}
Application.java
package com.mycompany.app;
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}
CachingConfiguration.java
package com.mycompany.app;
@EnableCaching
@EnableAutoConfiguration
@Configuration
public class CachingConfiguration {
//Configure CacheManager bean
}
AppRunner.java
package com.mycompany.app;
@Component
public class AppRunner implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);
private final BookService bookService;
@Autowired
public AppRunner(BookService bookService){
this.bookService = bookService;
}
@Override
public void run(String... args) throws Exception{
getBooks();
}
}
BookService.java
package com.mycompany.app;
@Service
public class BookService {
private BookRepository bookRepository;
@Autowired
public BookService(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
public Book getByIsbn(String isbn){
return bookRepository.getByIsbn(isbn);
}
}
BookRepository.java
package com.mycompany.app
@Component
public interface BookRepository {
Book getByIsbn(String isbn);
}