Почему @Cacheable не работает при вызове кэшируемого метода из метода не бобового класса

Я неожиданно обнаружил, что @Cacheable не работает, когда я вызываю кэшируемый метод из метода внутри не бобового класса.

Пожалуйста, найдите ниже мой код и помогите мне, что является проблемой или чем-то, что я пропускаю.

EmployeeDAO.java

@Component("employeeDAO")
public class EmployeeDAO {
private static EmployeeDAO staticEmployeeDAO;

public static EmployeeDAO getInstance(){
    return staticEmployeeDAO;
}

@PostConstruct
void initStatic(){
    staticEmployeeDAO = this;
}

@Cacheable(value = "employeeCache")
public List<Employee> getEmployees() {
    Random random = new Random();
    int randomid = random.nextInt(9999);
    System.out.println("*** Creating a list of employees and returning the list ***");
    List<Employee> employees = new ArrayList<Employee>(5);
    employees.add(new Employee(randomid, "Ben", "Architect"));
    employees.add(new Employee(randomid + 1, "Harley", "Programmer"));
    employees.add(new Employee(randomid + 2, "Peter", "BusinessAnalyst"));
    employees.add(new Employee(randomid + 3, "Sasi", "Manager"));
    employees.add(new Employee(randomid + 4, "Abhi", "Designer"));
    return employees;
}    

MyThread.java

class MyThread{
public void run(){
    //How to get Employee data. ?????
}
}    

UtilityClass.java

public class UtilityClass {
public static void getEmployee(){
    EmployeeDAO.getInstance().getEmployees();
}
}    

Main.java

public class Main {


public static void main(String[] args) {

    ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    EmployeeDAO dao = (EmployeeDAO)context.getBean("employeeDAO");

    System.out.println("1'st call");
    dao.getEmployees();
    System.out.println("2'nd call");
    dao.getEmployees();
    System.out.println("Call cache method using utility class");

    System.out.println("1'st call on utilityclass");
    UtilityClass.getEmployee();
    System.out.println("2'nd call on utilityclass");
    UtilityClass.getEmployee();
}
}    

Выход:

1'st call
*** Creating a list of employees and returning the list ***
2'nd call
Call cache method using utility class
1'st call on utilityclass
*** Creating a list of employees and returning the list ***
2'nd call on utilityclass
*** Creating a list of employees and returning the list ***  

Может кто-нибудь мне помочь?

1 ответ

Spring использует прокси для применения AOP, однако прокси создаются после того, как bean-компонент создан.

В вашем @PostConstruct аннотированный метод, на который вы устанавливаете ссылку this однако в этот момент это незакрытый экземпляр компонента. Вам действительно нужен прокси-экземпляр.

Я также хотел бы отметить, что ваше решение очень плохое и не пройдет мою проверку качества. но это имхо.

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