普通类怎么调用Service层?

乐之者v 2018-05-21 09:31:40
我在Controller层可以调用Service。用Tomcat打开访问url也没问题。
我这边需要在一个普通类,也就是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();

}
}

谁有空帮忙看一下。。我折腾了三天还是没解决。
...全文
2272 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_43289604 2021-01-07
  • 打赏
  • 举报
回复
请问springboot能通过注解实现吗?
zhlil0720 2019-03-06
  • 打赏
  • 举报
回复
我今天测试了下,大概有几种方法, 前提是你的spring容器已经启动 1、就像网上的那样,先setApplicationContext,再获取需要的Bean对象, 2、用静态变量 new 一个实例,再写个静态方法将对象返回;另外需要通过静态工厂bean返回这个实例,并注册到spring容器; 配置就是<bean class="XXX.XXX.Test" factory-method="getTest"></bean>,这样就可以在这个Test类中使用@Autowire获取spring中的Bean
  • 打赏
  • 举报
回复
可以写一个serviceUtil类,去拥有service对象,这个util类也写成spring管理的类,然后通过一个static的getService方法去获取这个service 这样不仅方便,而且可以拥有众多service对象,可以集中管理调用
steven_zhan 2018-05-23
  • 打赏
  • 举报
回复
自己创建service对象呗。。。
RockeyCui 2018-05-23
  • 打赏
  • 举报
回复
你的main方法里没有启动spring的代码啊,spring没启动,你怎么通过spring拿到对应的bean。你在controller里能拿到是因为你的项目已经起来了。4楼这句话 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml"); 是对的,单元测试一般这样通过这句话启动spring。
yjsl__ 2018-05-22
  • 打赏
  • 举报
回复
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml"); //从 IOC 容器中获取 bean 的实例 LocalTraceService localTraceService= (LocalTraceService ) ctx.getBean("localTraceService"); localTraceService.selectTraceList();
toitorse2 2018-05-22
  • 打赏
  • 举报
回复
这个需要重新配置ApplicationContext.xml,普通类启动的时候重新加载把
Braska 2018-05-22
  • 打赏
  • 举报
回复
工具类没问题的 service类和工具类都必须被spring扫描到 测试类没必要加@Component注解
maradona1984 2018-05-22
  • 打赏
  • 举报
回复
工具类没啥毛病,你得看你这个类被扫描到了没
当年的春天 2018-05-21
  • 打赏
  • 举报
回复 3
https://blog.csdn.net/zhanghan18333611647
乐之者v 2018-05-21
  • 打赏
  • 举报
回复
我这边的bean类有点多。。如果通过在ApplicationContext.xml文件里面一个个配置bean。几十个bean也得配到吐血。。 还是想直接用注解搞定。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧