我这边需要在一个普通类,也就是main方法里面调用Service层。
由于普通类不属于Spring管理。我在类上面加了@Component也还是不行。
想通过ApplicationContext来获取bean,还是空指针。
百度搜索出来的博客,写的博文千篇一律。。试了没一个管用的。。
真是要命啊。。一直都解决不了。
这是Service层:
@Service("localTraceService")
public class LocalTraceServiceImpl implements LocalTraceService{
@Autowired
private LocalTraceDao localTraceDao;
@Override
public List<LocalTrace> selectTraceList(){
return this.localTraceDao.selectTraceList();
}
}
这下面是网上找的工具类:
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static Logger logger = Logger.getLogger(SpringContextUtil.class);
private static ApplicationContext applicationContext = null;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
logger.info("------SpringContextUtil setApplicationContext-------");
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 注意 bean name默认 = 类名(首字母小写)
* 例如: A8sClusterDao = getBean("a8sClusterDao")
* @param name
* @return
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
/**
* 根据类名获取到bean
* @param <T>
* @param clazz
* @return
* @throws BeansException
*/
@SuppressWarnings("unchecked")
public static <T> T getBeanByName(Class<T> clazz) throws BeansException {
try {
char[] cs=clazz.getSimpleName().toCharArray();
cs[0] += 32;//首字母大写到小写
return (T) applicationContext.getBean(String.valueOf(cs));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return applicationContext.isSingleton(name);
}
}
最后是main方法:
import com.cmsz.crm.service.LocalTraceService;
import com.cmsz.crm.util.SpringContextUtil;
import org.springframework.stereotype.Component;
@Component
public class SpringTest {
public static void main(String[] args) {
LocalTraceService localTraceService=(LocalTraceService) SpringContextUtil.getBean("localTraceService");
localTraceService.selectTraceList();
}
}
谁有空帮忙看一下。。我折腾了三天还是没解决。
4 个解决方案
#1
我这边的bean类有点多。。如果通过在ApplicationContext.xml文件里面一个个配置bean。几十个bean也得配到吐血。。
还是想直接用注解搞定。
还是想直接用注解搞定。
#2
https://blog.csdn.net/zhanghan18333611647
#3
这个需要重新配置ApplicationContext.xml,普通类启动的时候重新加载把
#4
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从 IOC 容器中获取 bean 的实例
LocalTraceService localTraceService= (LocalTraceService ) ctx.getBean("localTraceService");
localTraceService.selectTraceList();
//从 IOC 容器中获取 bean 的实例
LocalTraceService localTraceService= (LocalTraceService ) ctx.getBean("localTraceService");
localTraceService.selectTraceList();
#1
我这边的bean类有点多。。如果通过在ApplicationContext.xml文件里面一个个配置bean。几十个bean也得配到吐血。。
还是想直接用注解搞定。
还是想直接用注解搞定。
#2
https://blog.csdn.net/zhanghan18333611647
#3
这个需要重新配置ApplicationContext.xml,普通类启动的时候重新加载把
#4
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从 IOC 容器中获取 bean 的实例
LocalTraceService localTraceService= (LocalTraceService ) ctx.getBean("localTraceService");
localTraceService.selectTraceList();
//从 IOC 容器中获取 bean 的实例
LocalTraceService localTraceService= (LocalTraceService ) ctx.getBean("localTraceService");
localTraceService.selectTraceList();