Spring项目中@Autowired注入JiraClientModel时对象为null问题
问题根因
Spring的字段注入(@Autowired 直接标记在类成员变量上)的执行时机晚于类构造方法的执行周期:Spring需要先调用类的构造方法实例化对象,之后再反射注入标记了@Autowired的成员属性,因此你在构造方法中访问jiraClientModel时必然为null。
解决方案
方案1:改用构造方法注入(Spring官方推荐的注入方式)
直接将JiraClientModel作为构造方法的入参,Spring实例化JiraService时会自动将容器中的JiraClientModel实例注入到构造参数中,你可以直接在构造方法内使用:
@Component @Getter @Setter @Log public class JiraService { JiraClientModel jiraClientModel; public JiraService(JiraClientModel jiraClientModel, @Value(value = "${jira.credentials.userName}") String userName, @Value(value = "${jira.credentials.password}") String password, @Value(value = "${jira.url}") String url, @Value(value = "${jira.jql.query}") String query) throws URISyntaxException { this.jiraClientModel = jiraClientModel; // 这里直接操作jiraClientModel即可,不会为null jiraClientModel.setSomeValues(...); } }
方案2:使用@PostConstruct注解执行初始化逻辑
把需要依赖注入完成后才能执行的初始化逻辑,放到被@PostConstruct修饰的方法中,该方法会在Spring完成所有属性注入之后自动触发:
@Component @Getter @Setter @Log public class JiraService { @Autowired JiraClientModel jiraClientModel; private String userName; private String password; private String url; private String query; public JiraService(@Value(value = "${jira.credentials.userName}") String userName, @Value(value = "${jira.credentials.password}") String password, @Value(value = "${jira.url}") String url, @Value(value = "${jira.jql.query}") String query) throws URISyntaxException { // 构造方法只接收配置参数赋值给类成员 this.userName = userName; this.password = password; this.url = url; this.query = query; } @PostConstruct private void init() { // 此处jiraClientModel已经完成注入,可以正常操作 jiraClientModel.setSomeValues(...); } }
内容的提问来源于stack exchange,提问作者Pandor
相关产品推荐
相关产品推荐

