@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
}
UserService
由UserServiceBuilder
创建,它将从配置文件中读取属性日志。
然后将UserService
注入到UserCtrl
,它首先会起作用。
但是,一旦我将@Cachable
添加到UserService
的一种方法中,注入的UserService
的所有字段将为空。
似乎当使用缓存时,spring会创建UserService
的代理,并且该代理对象没有文件。
该如何解决?
答案 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
注册。令人困惑。