在spring项目中,通常会加入一些自己或网上的工具类,java在调用的时候通常是new出一个对象,我们又想在这个类中实现对spring的操作。
案例:java监控指定目录文件,用到一个类
public class FileListener extends FileAlterationListenerAdaptor{
private Logger log = Logger.getLogger(FileListener.class);
/**
* 文件创建执行
*/
public void onFileCreate(File file) {
log.info("[新建]:" + file.getAbsolutePath());
}
}
java调用:
observer.addListener(**new FileListener()**);
在FileListener这个类中想通过spring实现对数据库的操作,所以首先应该想到通过注解或是get,set方式注入bean,但是在测试的时候总是出现java.lang.NullPointerException。
原因分析:
通过new出的对象只是java普通类,并没有交给spring管理,所以在对象中是不能获取这个bean。
解决方法:
需要写一个工具类来获取所需要的bean
/**
* 获取bean的工具类
* @author DELL
*
*/
public class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
/**
* 适用于springbean使用注解@Service("XXXService")
* 获取接口对象 参数传入 XXXService
* @param beanName
* @return
*/
public static Object getBean(String beanName){
return applicationContext.getBean(beanName);
}
/**
* 适用于springbean使用注解@Service
* 获取接口对象 参数传入 XXXService.class 不是 XXXServiceImpl.class
* @param c
* @return
*/
public static Object getBean(Class c){
return applicationContext.getBean(c);
}
}
然后将此bean加到spring容器中,applicationContext.xml中添加:
<bean id="springContextUtil" class="xxxx.SpringContextUtil"></bean>
在FileListener这个类中获取bean
public void onFileCreate(File file) {
ApplicationContext context = SpringContextUtil.getApplicationContext();
FileUploadImpl fileUpload = (FileUploadImpl)context.getBean(FileUploadImpl.class);
log.info("[新建]:" + file.getAbsolutePath());
//文件上传存库
fileUpload.fileUpload(file.getAbsolutePath());
}
这样就可以通过spring管理了,但是需要注意的是这个FileUploadImpl需要定义bean(或是注解方式等等等)
<bean id="fileUploadImpl" class="xxxx.FileUploadImpl"></bean>