当前位置: 首页 > Linux

普通对象使用spring容器中的对象

时间:2023-04-06 19:27:06 Linux

引用:有时候工作中需要在普通对象中调用spring管理的对象,但是普通java对象直接使用@Autowired或者@Resource时,会被注入如果对象是null,会报空指针。我们可以简单的理解为spring是一个公司,它管理的对象就是它的员工,而普通的java对象就是其他公司的员工。其他公司如果不经过spring公司的同意,想找spring员工一起工作,那肯定是没办法的。解决方法:方法一:如果这个普通对象可以被spring管理,最好直接交给spring管理,这样给spring管理的bean注入其他bean是没有问题的。方法二:当我们的普通对象不能被spring管理时,我们可以创建一个公共的springBeanUtil,为普通对象提供spring员工(有点像spring公司的外包部,把对象外包给其他公司,哈哈)。@ServicepublicclassSpringBeanUtilimplementsApplicationContextAware{publicstaticApplicationContextapplicationContext;@OverridepublicvoidsetApplicationContext(ApplicationContextcontext)throwsBeansException{applicationContext=context;}//这里是用来根据类类型获取bean当然你也可以根据name或者其他获取bean方法主要有applicationContext,你可以随便publicstaticObjectgetBeanByClass(Classclazz){returnapplicationContext.getBean(克拉兹);}}这个util其实实现了ApplicationContextAware这个接口,有朋友想问一下这个接口是做什么用的?这里是链接地址,ApplicationContextAware参考资料。然后我也将文档中的解释给摘录了公共接口ApplicationContextAware扩展AwareInterface由任何希望被通知它运行的ApplicationContext的对象实现。实现这个接口是有意义的,例如当一个对象需要访问一个一组协作bean。请注意,通过bean引用进行配置比仅出于bean查找目的实现此接口更可取。如果对象需要访问文件资源,也可以实现此接口,即想要调用getResource,想要发布应用程序事件,或需要访问消息源。但是,在这种特定情况下,最好实现更具体的ResourceLoaderAware、ApplicationEventPublisherAware或MessageSourceAware接口。请注意,文件资源依赖性也可以作为Resource类型的bean属性公开,通过bean工厂自动类型转换的字符串填充。这个删除仅出于访问特定文件资源的目的而需要实现任何回调接口。ApplicationObjectSupport是应用程序对象的便利基类,实现了这个接口。大概意思就是只要实现了ApplicationContextAware接口的类就希望知道当前运行的applicationContext是什么,然后说如果要获取资源,最好使用ResourceLoaderAware、ApplicationEventPublisherAware或者MessageSourceAware接口,最后来一句我们知道你要用这??些接口,所以我们给你做了一个实现这些接口的抽象类ApplicationObjectSupport(在spring-context的jar包中)。这里说的很清楚,如果要使用bean,就实现ApplicationContextAware,因为我们这里不需要使用静态资源,所以不需要spring提供的ApplicationObjectSupport。有兴趣的可以自己研究一下。我们先简单看一下ApplicationContextAware类里面都有什么?voidsetApplicationContext(ApplicationContextapplicationContext)抛出BeansException;发现只有一个方法,spring在初始化的时候,会把当前的applicationContext传递给ApplicationContextAware的setApplicationContext方法,所以只要实现类拿到applicationContext,就可以通过类类型或者类名获取bean在春天。原理其实很简单。使用的时候,我们可以调用spring中的bean。如下:Testtest=(Test)SpringBeanUtil.getBeanByClass(Test.class);