举例说明:
@componentpublic class initdata { /** * 初始化加载bean */ @postconstruct public void init() { map<string, string> map = new hashmap<string, string>(); for (int i=0;i<10;i++) { map.put(i+"", i+""); } //模拟加载一些别单例模式bean的数据初始化 errormsgutil1.getinstance().tmap(map); errormsgutil2.getinstance().tmap(map); }
好了,如果你开启了spring的懒加载模式,而且 initdata这个bean只是被扫描而没有被注入,那么errormsgutil里的map永远是空的。
@postconstruct实在bean初始化的时候被创建的,开启了懒加载显然如果initdata没有被用到那么就一直不执行了。
此坑已踩,小弟还是对spring理解不深,继续学习。
ps:如何开启spring的懒加载模式,在spring.xml中加上下面的代码中最后一句即可
<?xml version="1.0" encoding="utf-8"?><beans xmlns="/d/file/titlepic/" xmlns:xsi="/d/file/titlepic/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="/d/file/titlepic/" xmlns:mvc="/d/file/titlepic/" xmlns:tx="/d/file/titlepic/" xsi:schemalocation=" hgerman的复数ttp://www.springframework.org/schema/beans /d/file/titlepic/spring-beans-3.0.xsd http://www.springframework.org/schema/context /d/file/titlepic/spring-context-3.0.xsd " default-lazy-init="true">
前两天做了个纯java代码的rabbitmq监听多个ip的客户端功能,由于用的不是配置方式的listener方式—博文中有这一节,无法自动启动。就用@postconstruct来项目启动时运行监听mq,但是老遇到调用业务逻辑层方法时,注入不成功导致空指针异常。今天排查了一下,发现主要问题是框架扫包忽略了。
<!-- 自动扫描该包,支持注解的层限制,把api这个controller层排除在外了。另外多个包中间用逗号医学院校排名或者分号隔开都可以。 --><context:component-scan ba-package="com.**.rvice,com.**.action,com.**.common" > <context:include-filter type="annotation" expressi火龙果的吃法on="org.springframework.stereotype.controller"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.api"/></context:component-scan>
由于扫包是扫rvice层和action层(相当于rvice层),common工具层。所以在api层(相当于controller层)用@rvice和不用注解都是错误的,都会导致注入失败。
出了这个范围@postconstruct是无效的。应用在启动时是不会走带有这个注解的方法的。
在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方如何当好班长法所在的类必须放入服务之前调用。也就是该注解的类上不能随便注解:经验总结是能用@rvice注解,不能用@controller注解,否则启动不会走这个方法。这个类定位为服务层/业务层。而不是控制层(web层)
有了上面说的注意点。我重新在工具类包common包中写了个测试类。然后spring配置文件上扫包范围增加了这个common包。代码如下:com.zhanglf.common.cache.commoncachemap.java
package com.zhanglf.common.cache;import javax.annotation.postconstruct;import javax.annotation.resource;import org.springframework.stereotype.rvice;import com.zlf.bo.staffbo;import其实我介意 com.zlf.rvice.istaffrvice;@rvice("commoncachemap")public class commoncachemap { @resource private istaffrvice staffrvice; @postconstruct public void getonestaff(){ staffbo staffbo = staffrvice.lectbyprimarykey("s01"); system.out.println(staffbo.getname()); }}
结果是注入成功,运行结果如下:
这样@postconstruct注入问题就解决了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 04:28:26,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/d4e9e420cacbece7fe1ba41058c13204.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:解决spring懒加载以及@PostConstruct结合的坑.doc
本文 PDF 下载地址:解决spring懒加载以及@PostConstruct结合的坑.pdf
留言与评论(共有 0 条评论) |