程序中也许有会有许多常用的,不会经常更改的数据,我们可以在程序初始化的时候就把他们加载,就不用频繁的加载或者查询。
以下是几个常用的,有COPY收集的,也有自己弄。
1. 实现BeanPostProcessor接口
1 @Component 2 public class LoadDataCache implements BeanPostProcessor { 3 4 @@Resource 5 private IDao dao; 6 7 @Override 8 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 9 // Bean实例化之前执行 10 return bean; 11 } 12 13 @Override 14 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 15 // Bean实例化之后执行 16 List list = dao.findAll(); 17 ..... // 做一些事情 18 return bean; 19 } 20 }
此方法我在用于查询数据库的时候,出现此个实例在依赖Bean之前加载的情况,我就没用这个,而是换成方法2. 实现ApplicationListener接口。
不过这个方法加载文件数据应该就不会有什么错误吧。
2. 实现ApplicationListener接口
1 @Component 2 public class LoadDataCache implements ApplicationListener<ApplicationEvent> { 3 4 @Resource 5 private IDao dao; 6 7 @Override 8 public void onApplicationEvent(ApplicationEvent arg0) { 9 // 在spring所有资源(xml和注解)加载注入完毕后执行 10 List list = dao.findAll(); 11 ..... // 做一些事情 12 } 13 }
推荐这个方法,如备注所描述,在spring所有资源(xml和注解)加载注入完毕后执行,那么依赖资源就都会先加载。
3. 利用bean便签中的init-method属性
1 @Component 2 public class LoadDataCache { 3 4 @Resource 5 private IDao dao; 6 7 public void init() { 8 // 在Bean实例化之前执行 9 List list = dao.findAll(); 10 ..... // 做一些事情 11 } 12 }
这种方法在使用时可能会遇到很多问题,我没使用,不便多说,贴出地址原文。原文地址
4.通过把方法返回值做成Bean注入
1 @Service("resourceBean") 2 public class ResourceBean implements ApplicationListener<ApplicationEvent> { 3 @Resource 4 private SystemLinkManager systemLinkManager; 5 6 public ResourceBean() { 7 } 8 9 @Bean(name="systemLinkList") 10 public List<SystemLink> getSystemLinkList() { 11 return systemLinkManager.findAll(); 12 13 } 14 @Bean(name="systemLinkPartnerList") 15 public List<SystemLink> getSystemLinkPartnerList() { 16 return systemLinkManager.findPartner(); 17 } 18 @Bean(name="systemLinkFriendLinkList") 19 public List<SystemLink> getSystemLinkFriendLinkList() { 20 return systemLinkManager.findFriendLink(); 21 } 22 }
1 <bean id="DBResources" class="java.util.LinkedHashMap"> 2 <constructor-arg> 3 <map> 4 <entry key="systemLinkList" value-ref="systemLinkList" /> 5 <entry key="systemLinkPartnerList" value-ref="systemLinkPartnerList" /> 6 <entry key="systemLinkFriendLinkList" value-ref="systemLinkFriendLinkList" /> 7 </map> 8 </constructor-arg> 9 </bean>
把数据构造成了一个map,后来改成方法一实现了。拿到之后直接put到静态变量去了。