普通类怎么调用Service层?

时间:2022-09-06 14:40:39
我在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();

    }
}

谁有空帮忙看一下。。我折腾了三天还是没解决。

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();

#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();