Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring @构造后单例成员字段_Spring_Annotations_Fortify - Fatal编程技术网

Spring @构造后单例成员字段

Spring @构造后单例成员字段,spring,annotations,fortify,Spring,Annotations,Fortify,在下面的场景中,有一个通用控制器。我正在执行@PostConstruct来实例化IfCompleted类。但是IfCompleted对象被创建为类变量。所以fortify是将singleton成员扔到字段中。避免这种情况的解决方案是什么 GenericController.java @Controller public class GenericController{ @Autowired public UserService service; @Autowired public webR

在下面的场景中,有一个通用控制器。我正在执行@PostConstruct来实例化IfCompleted类。但是IfCompleted对象被创建为类变量。所以fortify是将singleton成员扔到字段中。避免这种情况的解决方案是什么

GenericController.java

@Controller
public class GenericController{

@Autowired
public UserService service;

@Autowired
public webRoot webroot;

public IfCompleted ifCompleted;

@PostContstruct
public void show(){
   ifCompleted = new IfCompleted(webroot);
}

.....
.....
}

问题中的示例实质上是将控制权从Spring中移除,这通常不是一件好事
IfCompleted
应该是一个bean,其生命周期和连接由Spring控制

假设您不能或不愿意使用XML或基于Java的容器配置来定义带有
@DependsOn
约束的单例
IfCompleted
,现在也可以从
@组件创建bean定义,例如,如果您只能依赖组件扫描

用于更复杂生命周期管理的其他有用工具是
org.springframework.beans.factory.InitializingBean
org.springframework.beans.factory.BeanFactoryAware
接口


简短/快速答案可能只是将成员定义为
静态
,但我不熟悉Fortify的静态分析规则。

谢谢您的建议。我通过删除@PostConstruct块和@Autowired进行WebRoot声明来解决这个问题。我在spring上下文中注入WebRoot作为IfCompleted的构造函数参数

@控制器 公共类泛型控制器{

@自动连线 公共用户服务

@自动连线
public IfCompleted IfCompleted;

如果将成员更改为静态,它将不会是线程安全的。还有其他选择吗?解释如何使其成为静态并不使其成为线程安全的,标准Spring MVC中的
@控制器
是一个单例无论如何,您的
@PostConstruct
运行一次。无论是否为静态,您的IfCompleted对象都可以你的例子很一般,也许我们可以提供一些更好的建议,更详细一些。你能解释一下IfCompleted的作用吗?