当遇到@Cachable时,Spring Autowired对象将具有所有空字段

时间:2018-12-07 14:34:07

标签: spring spring-boot

@Service
public class UserService {
    private String name;
    //fields omitted
    //@Cacheable(value = "user", key = "#name")  //once added, the name will be null.
    public User getUser(String name) {
    }
}

@Service
class UserServiceBuilder(){
    public UserService build(ConfigBean config){
        UserService s = new UserServcie()
        s.name = config.xxxx
        //other config omitted
        return s;
    }
}

@Configuration
class AppConfig{

    @Bean
    public UserService UserService(UserServiceBuilder builder, ConfigBean configBean) {
        return builder.load(configBean);
    }

}

class UserCtrl {
    @Autowired
    private UserService UserService; // get null when the @Cachable 

}

UserServiceUserServiceBuilder创建,它将从配置文件中读取属性日志。

然后将UserService注入到UserCtrl,它首先会起作用。

但是,一旦我将@Cachable添加到UserService的一种方法中,注入的UserService的所有字段将为空。

似乎当使用缓存时,spring会创建UserService的代理,并且该代理对象没有文件。

该如何解决?

1 个答案:

答案 0 :(得分:1)

是的,是的,因为代理。您必须在UserService中添加吸气剂,如果要将UserService的字段放在外面,则必须使用此吸气剂。

@Service
public class UserService {
    private String name;
    //fields omitted
    //@Cacheable(value = "user", key = "#name")  //once added, the name will be null.
    public User getUser(String name) {
    }

    //ADD THIS:
    public String getName() {
      return this.name;
    }
}

但是,如果您在UserService方法中添加输出:

public User getUser(String name) {
  System.out.println("PING " + this.name);
  ...
}

您将看到对象内部的this.name不为空。

P.S。并且我认为您可以从@Service中删除UserService注释。因为您有@Service的{​​{1}}和@Bean注册。令人困惑。