T.G*_*T.G 21 spring hibernate spring-mvc autowired static-class
这是一个带有Hibernate的Spring MVC项目.我正在尝试创建一个Logger类,负责将日志输入数据库.其他类只调用具有一些属性的正确方法,这个类应该做所有的魔术.本质上它应该是一个具有静态方法的类,但这会导致autoiering dao对象出现问题.
public class StatisticLogger {
@Autowired
static Dao dao;
public static void AddLoginEvent(LogStatisticBean user){
//TODO code it god damn it
}
public static void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
//TODO code it god damn it
}
public static void addErrorLog(Exception e, String page, HashMap<String, Object> parameters){
ExceptionLogBean elb=new ExceptionLogBean();
elb.setStuntDescription(e);
elb.setSourcePage(page);
elb.setParameters(parameters);
if(dao!=null){ //BUT DAO IS NULL
dao.saveOrUpdateEntity(elb);
}
}
Run Code Online (Sandbox Code Playgroud)
怎么做对了?我该怎么做才能使dao对象为null?我知道我可以将它作为方法参数传递,但这不是很好.我猜测autowired无法在静态对象上工作,因为它们是为早期创建的,所以尚未创建自动维护机制.
Wei*_* Li 56
你不能@Autowired是静态领域.但是处理这个问题有一个棘手的技巧:
@Component
public class StatisticLogger {
private static Dao dao;
@Autowired
private Dao dao0;
@PostConstruct
private void initStaticDao () {
dao = this.dao0;
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,就是@Autowired一个实例字段,并在构造对象时将值赋给静态字段.顺便说一句,该StatisticLogger对象也必须由Spring管理.
Sea*_*oyd 19
古典自动装配可能不起作用,因为静态类不是Bean,因此不能由Spring管理.这种情况有解决办法,例如通过使用了factory-method以XML的形式给出,或通过加载从Spring上下文豆静态初始化块,但我会建议是要改变你的设计:
不要使用静态方法,使用您在需要的地方注入的服务.如果你使用Spring,你也可以正确使用它.依赖注入是一种面向对象的技术,只有实际拥抱OOP才有意义.
| 归档时间: |
|
| 查看次数: |
42305 次 |
| 最近记录: |