代码编织梦想

解决无法注入spring容器,获取不到spring容器中的bean问题

前两天工作中遇到一个问题,收到的需求是根据logbak日志实现通过过滤错误日志发送预警邮件到邮箱,logback自定义实现类如下

/**
 * @author KyleYao
 * @date 2020/4/21 13:01
 * @description: 错误日志邮件发送
 */
@Componet
public class ErrorEmailAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {

    private final String[] TO = {"2854646670@qq.com"};

    private final String SUBJECT_PREFIX = "【Error】: ";

	@Autowired
	private MailUtils mailUtils;

    @Override
    protected void append(ILoggingEvent event) {
//        System.out.println("level =" + event.getLevel());
//        System.out.println("msg =" + event.getMessage());
//        System.out.println("level =" + event.getLevel());
        //根据规则做相应调用 TODO
        if (event.getMessage().contains("邮件")) {
            System.out.println("开始发送邮件");
            MailBean mailBean = getMailBean(event);
            MailUtils.getInstance().sendMailAttachment(mailBean);
        }
    }

    private MailBean getMailBean(ILoggingEvent event) {
        MailBean mailBean = new MailBean();
        mailBean.setTo(TO);
        mailBean.setSubject(SUBJECT_PREFIX + event.getLoggerName());
        mailBean.setContent("date = " + event.getTimeStamp() + "\n" +
                "level =" + event.getLevel() + "\n" +
                "message =" + event.getMessage() + "\n" +
                "thread = " + event.getThreadName() + "\n" +
                "logger =" + event.getLoggerName() + "\n" +
                "message =" + event.getMessage());
        return mailBean;
    }
}

因为MailUtils是通过@Service注解注入到spring容器中的,所以我这里给这个类加上@Componet注解想让他加入到容器中,这样可以获取自动注入的MailUtils,但是发现怎么也获取不到(这个原因后续研究),后来在同事帮助下使用了另一种写法,改造了一下MailUtils

@Slf4j
@Service
public class MailUtils {
	@Autowired
	private JavaMailSender javaMailSender;
	@Autowired
	private MailProperties mailProperties;

	public static MailUtils getInstance() {
		return SpringContextUtils.getBean(MailUtils.class);
	}

截取部分,通过自己封装的spring上下文工具获取到他的实体,这样在某些类无法注入到容器中时又想获得spring容器中的管理的bean的时候可以通过这种方式实现。
附:spring上下文工具如下:

/**
 * Spring上下文工具类
 * 
 * @author Andrew
 */
@Component
public class SpringContextUtils implements ApplicationContextAware {

	private static ApplicationContext applicationContext;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		if (SpringContextUtils.applicationContext == null) {
			SpringContextUtils.applicationContext = applicationContext;
		}
	}

	public static ApplicationContext getContext() {
		return SpringContextUtils.applicationContext;
	}

	public static <T> T getBean(Class<T> beanType) {
		return applicationContext.getBean(beanType);
	}

	public static <T> T getBean(String beanName, Class<T> beanType) {
		return applicationContext.getBean(beanName, beanType);
	}

	public static Object getBean(String beanName) {
		return applicationContext.getBean(beanName);
	}

	public static ParamsProperties getParamsProperties() {
		return (ParamsProperties) getBean("paramsProperties");
	}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/oWanShiKaiTouNan/article/details/105720500

Java并发笔记 (3) ---- 原子操作-爱代码爱编程

文章目录 1 如何实现原子操作2 **Java如何实现原子操作**2.1 **CAS** 实现原子操作的三大问题2.2 使用锁机制实现原子操作3 源码分析 ----- `AtomicInteger` 原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多

“IO流“的奥秘.....-爱代码爱编程

文章目录 1.什么是IO流?2.流的分类方式?3. IO流四大家族?4.常用的流有哪些?5.FileInputStream?6.FileoutputStream?7.FileReader/FileWriter?8.InputStreamReader/OutputStreamWriter?9.BufferedReader/BufferedWriter

gradle学习笔记一:安装gradle-爱代码爱编程

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。工欲善其事必先利其器,首先先学习一下如何在Mac,Linux,Windos下安装Gradle Mac下安装 安装 brew install gradle 验证 gradle -

给心爱的她(他)用java发送一封邮件吧-爱代码爱编程

关与作者更多博客请访问云里云外开源社区 1.SMTP协议2.POP3协议3.邮件的心路历程4.QQ邮箱和网易邮箱的配置5.代码6.常见错误随着我们学习java的深入,也渐渐发现了它的一些乐趣,比如发送邮件…(还有很多啊) 还是老规矩,定义走起。 一、SMTP协议 SMTP的全称是“Simple Mail Transfer Protocol”,即

自己写一个简单的Spring IOC容器-爱代码爱编程

  关键代码:  package main.java.springDemo; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.concurre

Annotation Type Remove-爱代码爱编程

Skip navigation links Overview Package Class Use Tree Deprecated Index Help Prev Class Next Class Frames No Frames Summary: Field | Required | Optional Detail: Field | E

Spring学习-01day-爱代码爱编程

Spring学习-day01 bean的作用域 scope属性的取值 prototype多实例的 容器启动不会创建每次创建都会创建新的对象singleton单实例的 在容器启动的时候就会被创建在任何时候获取都是同一个对象request (没用)session (没用)工厂模式创建bean 静态工厂 工厂本身不需要创建对象,通过静态方法

记 oAtuh2.0 token 远程认证服务器验证失效的问题-爱代码爱编程

最近在写 oAuth2.0 认证授权服务,本来使用的是 shiro 作为一个认证授权框架,而后发现 shiro 对于分布式微服务的支持十分不友好,转而用 Spring Security,不得不说配合 Spring 全家桶确实很香。具体的项目架构如下图,uaa是认证授权服务,另一个是资源服务。(文末有源码地址) 完成认证授权服务并通过各类模式的令牌颁发测试,

SpringMVC常见相关经典面试题-爱代码爱编程

SpringMVC常见经典面试题 1. Springmvc 工作原理是什么? 客户端发送请求到 DispatcherServlet DispatcherServlet 查询 handlerMapping 找到处理请求的 Controller Controller 调用业务逻辑后,返回 ModelAndView DispatcherServlet 查询 Mo

SpringBoot应用部署到外置Tomcat-爱代码爱编程

概述 SpringBoot让我们实现了简单、方便、快速的创建一个Spring Web项目,其约定优于配置的模式让我们少写了大量的配置。内置tomcat更是让开发用得爽歪歪,但如果我们需要将SpringBoot项目发布到外置tomcat中,该如何操作呢? 一、修改Tomcat的打包方式 在pom.xml中将打包方式改成war <packagin

关于使用SpringMVC在使用com.sun.jersey进行跨服务器上传文件的各种报错的问题解决方案-爱代码爱编程

在使用SpringMVC配合com.sun.jersey进行跨服务器上传文件时,遇到了各种各样的问题,百度了也尝试了N多种方法,最终才一个个的解决,真是心累啊。。。 案例的代码如下,格式或者规范各位大佬就不要介意了,这里主要是记录这次解决问题的历程而已,嘿嘿嘿 @RequestMapping("/t3") public String t

Spring整合Hibernate在配置MySQL数据库方言时报错 'hibernate.dialect' must be set when no Connection available-爱代码爱编程

报错为: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderD