Spring @构造后单例成员字段
在下面的场景中,有一个通用控制器。我正在执行@PostConstruct来实例化IfCompleted类。但是IfCompleted对象被创建为类变量。所以fortify是将singleton成员扔到字段中。避免这种情况的解决方案是什么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
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的作用吗?