普通对象使用spring容器中的对象的实现方法

 更新时间:2019年06月03日 10:28:27   作者:我想问问天  
这篇文章主要介绍了普通对象使用spring容器中的对象的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引语:

工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource的时候会发现被注入的对象是null,会报空指针。我们可以简单的理解为spring是一个公司,它管理的对象就是它的员工,而普通的java对象是其他公司的员工,如果其他公司要找spring公司的员工一起共事没有经过spring公司的同意肯定是不行的。

解决方式:

方法一:如果这个普通对象可以被spring管理的话,最好是直接交给spring管理,这样spring管理的bean中注入其他的bean是没有问题的。

方法二:当我们的普通对象没有办法交给spring管理的时候,我们可以创建一个公共的springBeanUtil专门为普通对象提供spring的员工(有点像spring公司的外包部门,把对象外包给其他公司使用,哈哈)。

@Service
public class SpringBeanUtil implements ApplicationContextAware {

  public static ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    applicationContext = context;
  }

  // 这里使用的是根据class类型来获取bean 当然你可以根据名称或者其他之类的方法 主要是有applicationContext你想怎么弄都可以
  public static Object getBeanByClass(Class clazz) {
    return applicationContext.getBean(clazz);
  }
}

这个util呢,其实就是实现了ApplicationContextAware接口,有小伙伴要问了这个接口是干嘛的?这里给出链接地址,ApplicationContextAware参考资料。然后我也将文档中的解释给摘录过来了

public interface ApplicationContextAware extends Aware
Interface to be implemented by any object that wishes to be notified of the ApplicationContext that it runs in.
Implementing this interface makes sense for example when an object requires access to a set of collaborating beans. Note that configuration via bean references is preferable to implementing this interface just for bean lookup purposes.
This interface can also be implemented if an object needs access to file resources, i.e. wants to call getResource, wants to publish an application event, or requires access to the MessageSource. However, it is preferable to implement the more specific ResourceLoaderAware, ApplicationEventPublisherAware or MessageSourceAware interface in such a specific scenario.
Note that file resource dependencies can also be exposed as bean properties of type Resource, populated via Strings with automatic type conversion by the bean factory. This removes the need for implementing any callback interface just for the purpose of accessing a specific file resource.
ApplicationObjectSupport is a convenience base class for application objects, implementing this interface.

大概意思就是说只要实现了ApplicationContextAware接口的类,期望被告知当前运行的applicationContext是什么。然后又说了如果是想要获取资源最好是用ResourceLoaderAware, ApplicationEventPublisherAware or MessageSourceAware 这几个接口,最后还来了一句我们知道你们要使用这些接口,所以我们帮你弄了一个实现了这些接口的抽象类ApplicationObjectSupport(在spring-context的jar包中)。这里说得很清楚要使用bean的话,实现ApplicationContextAware,因为我们这里不需要使用静态资源之类的所以我们就不用spring为我们提供的ApplicationObjectSupport了,有兴趣的可以自己研究下。

我们这里简单的看一下ApplicationContextAware类里面都有啥?

void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

发现就一个方法,spring初始化的时候会将当前的applicationContext传给ApplicationContextAware的setApplicationContext方法,所以只要实现类将这个applicationContext拿到了,就可以通过class类型或者class的名称来获取到spring中的bean了。原理其实很简单吧。使用的时候我们可以调用spring中的bean。如下:

Test test = (Test) SpringBeanUtil.getBeanByClass(Test.class);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MyBatis实现表连接查询写法(三种对应关系)的方法总结

    MyBatis实现表连接查询写法(三种对应关系)的方法总结

    这篇文章主要介绍了MyBatis实现表连接查询写法(一对一关系、一对多关系、多对多关系)的方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-01-01
  • java sql ResultSet 之getRow()用法说明

    java sql ResultSet 之getRow()用法说明

    这篇文章主要介绍了java sql ResultSet 之getRow()用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java封装数组之添加元素操作实例分析

    Java封装数组之添加元素操作实例分析

    这篇文章主要介绍了Java封装数组之添加元素操作,结合实例形式分析了Java封装数组实现元素追加、插入等相关操作技巧,需要的朋友可以参考下
    2020-03-03
  • Java数组与堆栈相关知识总结

    Java数组与堆栈相关知识总结

    今天给大家带来的是关于Java的相关知识,文章围绕着Java数组与堆栈展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java使用xpath解析xml示例分享

    java使用xpath解析xml示例分享

    XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力,下面是一小示例,需要的朋友可以参考下
    2014-03-03
  • Springcloud Stream消息驱动工具使用介绍

    Springcloud Stream消息驱动工具使用介绍

    SpringCloud Stream由一个中间件中立的核组成,应用通过SpringCloud Stream插入的input(相当于消费者consumer,它是从队列中接收消息的)和output(相当于生产者producer,它是发送消息到队列中的)通道与外界交流
    2022-09-09
  • SpringBoot实现PPT格式文件上传并在线预览功能

    SpringBoot实现PPT格式文件上传并在线预览功能

    本文介绍SpringBoot实现PPT格式文件上传并在线预览功能,通过上传接口,可在C盘的tempfile目录下找到上传的文件,预览时会在同级目录下创建一个相同文件名后缀为pdf的文件,每次预览会先查找文件是否存在,存在则直接预览,不存在则会走上面的处理,需要的朋友可以参考下
    2022-02-02
  • JAVA的发展前景如何好不好自学

    JAVA的发展前景如何好不好自学

    这篇文章主要介绍了JAVA的发展前景如何好不好自学,很多朋友想自学java不知道好不好学,能不能学会,今天小编给大家分享一篇教程关于java的发展前景的文章,需要的朋友可以参考下
    2020-06-06
  • 使用spring-data-redis中的Redis事务

    使用spring-data-redis中的Redis事务

    这篇文章主要介绍了使用spring-data-redis中的Redis事务,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringCloud Eureka实现服务注册与发现

    SpringCloud Eureka实现服务注册与发现

    Eureka是一种基于REST(具像状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移。本文记录一个简单的服务注册与发现实例。感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论