我在开发过程中使用builder模式时:
第一次:使用@Resource来注入javabean,直接启动就报错了。
第二次:改为了@Autowired来注入,这时候启动不报错了,但是使用javabean调用方法时却报了空指针错误。
第三次:这时我又换成使用ApplicationContext注入,很棒,这次在开发工具idea里面可以正常启用并调用了。但是发布到linux环境就又出现空指针错误了。原来是静态代码加载的优先度高,这时ApplicationContext还没创建完所有的javabean.
第四次:使用静态方法来获取javabean。这次完美解决了问题。
下面是最终的注入代码了
/**
* 版权所有,侵权必究!
*/
package com.tip.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Spring Context 工具类
*
* @author Mark sunlightcs@gmail.com
*/
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);
}
public static Class<? extends Object> getType(String name) {
return applicationContext.getType(name);
}
}
package com.tip.modules.composite.service.impl;
import com.tip.common.utils.BeanUtils;
import com.tip.common.utils.SpringContextUtils;
import com.tip.common.utils.TipUtil;
import com.tip.modules.ajcase.service.bo.ZfInvolvedCaseBo;
import com.tip.modules.ajcase.service.bo.ZfInvolvedRegistrationBo;
import com.tip.modules.ajcase