@Autowired注解和静态方法
2018-03-26 00:39
465 查看
参考地址:https://www.cnblogs.com/chenfeng1122/p/6270217.html
项目中使用jstl的fns自定义标签,在jsp页面中调用工具类(不了解的可以先百度了解下fns自定义标签)<c:forEach items="${fns:assayListUtil('${sessionScope.patient.name}')}" var="e" begin="0" step="1" end="9">
<tr>
<td>
${e.reg_id}
</td>
...
</tr>
</c:forEach> 因为调用的工具类必须为静态方法,而静态方法里需要查询数据库,这就涉及到DAO,在静态方法里调用dao的时候,要求这个dao必须为静态变量,而简单的添加static没有报错,在调用的时候则会报空指针异常,最开始的写法如下:
错误写法:@Component
public class DataUtils {
@Autowired
private static PatViewDAO pdao;
public static List<Patient> patientListUtil(String pat_id){
return pdao.findPats(pat_id);
}
} 原因:Spring 依赖注入是依赖 set方法,set方法是普通的对象方法,而加上static的变量则是类的属性,无法再按我们的意愿注入。而却静态变量在类被创建之前就已经存在了。
有两种方法:
方法一:将@Autowire加到构造方法上 private static PatViewDAO pdao;
// 将@Autowired加到构造方法上,将它赋给静态变量
@Autowired
public DataUtils(PatViewDAO pdao) {
DataUtils.pdao = pdao;
}
public static List<Patient> patientListUtil(String pat_id){
return pdao.findPats(pat_id);
} 方法二:用@PostConstruct注解(具体讲解可以百度)
项目中使用jstl的fns自定义标签,在jsp页面中调用工具类(不了解的可以先百度了解下fns自定义标签)<c:forEach items="${fns:assayListUtil('${sessionScope.patient.name}')}" var="e" begin="0" step="1" end="9">
<tr>
<td>
${e.reg_id}
</td>
...
</tr>
</c:forEach> 因为调用的工具类必须为静态方法,而静态方法里需要查询数据库,这就涉及到DAO,在静态方法里调用dao的时候,要求这个dao必须为静态变量,而简单的添加static没有报错,在调用的时候则会报空指针异常,最开始的写法如下:
错误写法:@Component
public class DataUtils {
@Autowired
private static PatViewDAO pdao;
public static List<Patient> patientListUtil(String pat_id){
return pdao.findPats(pat_id);
}
} 原因:Spring 依赖注入是依赖 set方法,set方法是普通的对象方法,而加上static的变量则是类的属性,无法再按我们的意愿注入。而却静态变量在类被创建之前就已经存在了。
有两种方法:
方法一:将@Autowire加到构造方法上 private static PatViewDAO pdao;
// 将@Autowired加到构造方法上,将它赋给静态变量
@Autowired
public DataUtils(PatViewDAO pdao) {
DataUtils.pdao = pdao;
}
public static List<Patient> patientListUtil(String pat_id){
return pdao.findPats(pat_id);
} 方法二:用@PostConstruct注解(具体讲解可以百度)
@Component public class Test { private static PatViewDAO pdao; @Autowired private PatViewDAO pdao2; @PostConstruct public void beforeInit() { pdao = pdao2; } public static List<Patient> patientListUtil(String pat_id){ return pdao.findPats(pat_id); } }个人更倾向于方法一,相比方法二省掉了一个变量,代码量少。
相关文章推荐
- @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
- @Autowired注解和静态方法
- @Autowired注解和静态方法
- 静态 方法中使用Autowired注解的service或dao的问题
- 静态方法使用@Autowired注解报null问题
- 关于静态方法利用@Autowired注入的service类问题
- 从头认识Spring-2.3 注解装配-@autowired(3)-通过构造器方法注入
- servlet中利用spring的注解@Autowired自动注入service失败,优雅的解决方法
- 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(三):通过 @Autowired的使用来消除 set ,get方法。
- Spring4-自动装配Beans-通过注解@Autowired在构造方法上
- 在工具类静态方法调用@Autowired注入的bean方法
- 从头认识Spring-2.3 注解装配-@autowired(2)-通过set方法或者其他方法注入
- 从头认识Spring-2.3 注解装配-@autowired(3)-通过构造器方法注入
- 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(三):通过 @Autowired的使用来消除 set ,get方法。
- Spring @Autowired @Resource @Inject 注解使用方法及区别总结
- 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(三):通过 @Autowired的使用来消除 set ,get方法。
- Spring中使用@Autowired注解静态实例对象
- 不要将@Autowired注解用于static方法
- Spring @Autowired注解私有属性(无set方法)
- Spring@Autowired注解与省去get和set方法,对注解Autowired放在setter方法上的情况