2017-08-29 116 views
1

我遇到了我的Spring应用程序和SonarQube问题。 SQ将用“@Autowired”,“@Resource”,“@Inject”或“@Value”注释此成员,或者将其删除,从而标记两个示例。在实例变量mapLoadedByDatabaseCalls弹簧应用程序SonarQube问题S3749

例1:

@Service 
public class Service implements InitializingBean { 

    @Autowired 
    private Dao dao; 

    private Map<Object, Object> mapLoadedByDatabaseCalls; 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     mapLoadedByDatabaseCalls= new HashMap<>(Object.class); 
     .... 
    } 
} 

例2:

@Service 
public class Service { 

    @Autowired 
    private Dao dao; 

    private Map<Object, Object> mapLoadedByDatabaseCalls; 

    @PostConstruct 
    private void setMap() { 
     mapLoadedByDatabaseCalls= new HashMap<>(Object.class); 
     .... 
    } 
} 

什么是实例变量DI完成后,正确的方法是什么?

回答

0

我认为,这是缺憾和你原来的代码是更好的,但这会消除SonarQube投诉。在@Bean中初始化您的地图,然后将其引用为@Autowired。用@PostConstruct中的数据加载地图。

@Bean 
public Map<Object, Object> getMapLoadedByDatabaseCalls() { 
    return new HashMap<>(Object.class); 
} 

@Autowired 
private Map<Object, Object> mapLoadedByDatabaseCalls; 

@PostConstruct 
private void setMap() { 
    ... 
    // load data into the map 
    mapLoadedByDatabaseCalls.put(key, value); 
    .... 
} 
1

Spring Documentation >Initialization callbacks section

建议您不要使用的InitializingBean接口 因为它不必要的夫妻代码春天。或者, 使用@PostConstruct注释或指定POJO初始化 方法。

本质的InitializingBean预先存在于春季JSR-250support came on Spring 2.5 onwards(包括@PostConstruct注释)之前

+1

确实推荐@PostConstruct而不是实现InitializingBean,但这不会解决SonarQube问题。 SonarQube仍然会抱怨。 –