在工具类中引用注解service

4 篇文章 0 订阅
2 篇文章 0 订阅

今天在写爬虫时遇到了在工具类中不能注解成功的问题。下面我把我的解决办法共享给大家。需要引入一个工具类。

package com.nieyb.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @author chenhy
 *以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.
 */
@Component
public class SpringContextHolder implements ApplicationContextAware {
	private static ApplicationContext applicationContext;

	@Override
	/**
	* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
	*/
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringContextHolder.applicationContext = applicationContext;
	}

	/**
	* 取得存储在静态变量中的ApplicationContext.
	*/
	public static ApplicationContext getApplicationContext() {
		checkApplicationContext();
		return applicationContext;
	}

	/**
	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
	*/
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		checkApplicationContext();
		return (T) applicationContext.getBean(name);
	}

	/**
	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
	*/
	@SuppressWarnings("unchecked")
	public static <T> T getBean(Class<T> clazz) {
		checkApplicationContext();
		return (T) applicationContext.getBeansOfType(clazz);
	}

	/**
	* 清除applicationContext静态变量.
	*/
	public static void cleanApplicationContext() {
		applicationContext = null;
	}

	private static void checkApplicationContext() {
		if (applicationContext == null) {
			throw new IllegalStateException("applicaitonContext未注入,请在springMVC.xml中定义SpringContextHolder");
		}
	}

}

在启动程序入口的man方法中添加注解

package com.nieyb;

import com.nieyb.dao.ArticleMapper;
import com.nieyb.dao.RuleMapper;
import com.nieyb.model.Article;
import com.nieyb.model.Rule;
import com.nieyb.service.ArticleService;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * Hello world!
 *
 */
@SpringBootApplication(scanBasePackages = {"com.nieyb"})
@RestController
@EnableScheduling
@MapperScan("com.nieyb.dao")
@EnableFeignClients(basePackages = {"com.nieyb.api"})
public class App 
{
   
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        SpringApplication.run(App.class,args);
    }
}

然后在工具类顶部添加

@Component注解。用
ArticleService articleService = SpringContextHolder.getBean("ArticleServiceImpl");来引入注解但是要在你要引入的service的实现类里面添加
@Service("ArticleServiceImpl")注解。参数一定要一致。

我完整的工具类是这样的:

package com.nieyb.gecco;


import com.alibaba.fastjson.JSONObject;
import com.geccocrawler.gecco.annotation.PipelineName;
import com.geccocrawler.gecco.pipeline.JsonPipeline;
import com.geccocrawler.gecco.request.HttpGetRequest;
import com.geccocrawler.gecco.request.HttpRequest;
import com.nieyb.model.Article;
import com.nieyb.model.ArticleDTO;
import com.nieyb.model.Dictionary;
import com.nieyb.service.ArticleService;
import com.nieyb.service.DictionaryService;
import com.nieyb.utils.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


@Slf4j
@Component
@PipelineName(value = "newsContentPipelines")
public class NewsCountentPopeline extends JsonPipeline {

    @Override
    public void process(JSONObject newsContent) {
        HttpRequest currRequest = HttpGetRequest.fromJson(newsContent.getJSONObject("request"));
        String title = newsContent.getString("title");
        String form = newsContent.getString("form");
        String news = newsContent.getString("news");
        if (title != "" && title != null && form != "" && form != null && news != "" && news != null) {
            System.out.println(title+"*****"+form);
            ArticleDTO articleDTO = new ArticleDTO();
            Article article = new Article();
            article.setContent(news);
            article.setForm(form);

            article.setTitle(title);

            articleDTO.setContentBody(news);
            articleDTO.setArticleOrigin(form);
            articleDTO.setArticleTitle(title);
            articleDTO.setContentTitle(title);
            articleDTO.setArticleStatus(1);
            //System.out.println(article);

            save(article,articleDTO);

        }


    }

    /***
     * 将文章入库
     * */


    public void save(Article article,ArticleDTO articleDTO){
        ArticleService articleService = SpringContextHolder.getBean("ArticleServiceImpl");
        DictionaryService dictionaryService = SpringContextHolder.getBean("DictionaryService");
        Dictionary dictionary = dictionaryService.selectById(1);
        String culmn =dictionary.getValue();
        articleDTO.setChannelId(culmn);
        article.setClumnId(culmn);
        //articleService.saveCMS(articleDTO);//保存的CMS库
        //articleService.saveCache(article);//保存到中间缓存库中
        articleService.addArticle(article);//保存到本地库
    }


}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值