@Autowired注解和静态方法

6 篇文章 0 订阅

    参考地址: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注解(具体讲解可以百度)
@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);
    }
}
    个人更倾向于方法一,相比方法二省掉了一个变量,代码量少。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值