使用SpringMVC或者SSH过程中,有时可能会遇到这么一个问题。就是在一个普通的JAVA类(不是controller也不是action类)中无法注入在spring配置文件中配置的bean。
比如你在一个普通java类想调用某个在spring中配置的service,你会发现不管你用@Resource还是@Autowired注解都无法注入,对象始终是null。
那是因为一般普通的Java类没有被spring代理,自然无法通过spring注入相关的对象。难道这样就不能调用了吗?这里提供下面一个类来解决这个问题:
SpringContextUtil
package com.im.utils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * 这个类是为了解决在普通类调用service的问题 * * @ClassName SpringContextUtil * @Description * @author kokjuis 189155278@qq.com * @date 2016-6-12 * @content * */ public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; // Spring应用上下文 // 下面的这个方法上加了@Override注解,原因是继承ApplicationContextAware接口是必须实现的方法 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextUtil.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } public static Object getBean(String name, Class requiredType) throws BeansException { return applicationContext.getBean(name, requiredType); } public static boolean containsBean(String name) { return applicationContext.containsBean(name); } public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { return applicationContext.isSingleton(name); } public static Class getType(String name) throws NoSuchBeanDefinitionException { return applicationContext.getType(name); } public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { return applicationContext.getAliases(name); } }
然后在spring配置文件中配置一下这个类:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <!--配置spring工具类 --> <bean id="SpringContextUtil" class="com.im.utils.SpringContextUtil" scope="singleton"></bean> </beans>
然后通过这个类提供的方法就能正常的获取在spring中托管的bean了,使用很简单:
/** * 获取spring托管的redis连接池 */ private JedisPool jedisPool = (JedisPool) SpringContextUtil.getBean("jedisPool");
补充知识:解决Spring中为静态static的@Resource自动注入失败的问题
在写一个单例模块时,在初始化对象时需要注入静态的参数,导致spring 暴出
@Resource annotation is not supported on static fields
可以通过将@Resource写在set方法上,并去除static
以上这篇JAVA解决在@autowired,@Resource注入为null的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍详解Spring关于@Resource注入为null解决办法,包括了详解Spring关于@Resource注入为null解决办法的使用技巧和注意事项,需要的朋友参考一下 初学spring,我在dao层初始化c3p0的时候,使用@Resource注解新建对象是发现注入为null,告诉我 java.lang.NullPointerException。 反复检查了配置文件,没有发现任何问题
问题内容: 我应该在DI中使用哪个批注或(特定于)? 我已经成功地在过去使用两种,和 我的直觉是坚持使用该标签,因为它已被人士批准。 有人对此有强烈的想法吗? 问题答案: 在3.0之前的spring中,哪一个都不重要。 在Spring 3.0中,支持标准(JSR-330)注释将其与结合使用。请注意,现在还支持元注释: 所以你可以有 要么 接着: 这样就减少了字符串名称的使用,因为字符串名称可能会拼
问题内容: 我应该在DI中使用哪个批注或(特定于Spring)? 我已经成功地在过去使用两种,和 我的直觉是坚持使用该标签,因为它已被jsr人士批准。 有人对此有强烈的想法吗? 问题答案: 在3.0之前的spring中,哪一个都不重要。 在Spring 3.0中,支持标准(JSR-330)注释-将其与结合使用。请注意,spring现在还支持元注释: 所以你可以有 要么 然后: 这样就减少了字符串名
项目: el-admin 后台 代码如下 deptService 对象没有用过注解, 为什么还能调用 deptService.download ? 有没有大佬知道这个对象是怎么被实例化的? 完整的 DeptController 代码如下
本文向大家介绍详解@Autowired(required=false)注入注意的问题,包括了详解@Autowired(required=false)注入注意的问题的使用技巧和注意事项,需要的朋友参考一下 1、前言 在使用spring开发过程中,我们基本上都是使用@Autowired这个注解,用来注入已有的bean。但是有些时候,会注入失败。当我们加上参数(required=false)就能解决。今
本文向大家介绍详解Spring @Autowired 注入小技巧,包括了详解Spring @Autowired 注入小技巧的使用技巧和注意事项,需要的朋友参考一下 今天和同事讨论到Spring自动注入时,发现有这么一段代码特别地困惑,当然大致的原理还是可以理解的,只不过以前从来没有这么用过。想到未来可能会用到,或者未来看别人写的代码时不至于花时间解决同样的困惑,所以小编还是觉得有必要研究记录一下。