【Spring】非SPRING管理的对象要引用SPRING容器管理的对象?对象之间如何引用?

原创 2016年05月31日 15:52:49

最近项目中就有如题的一个需求,有些对象,不希望将其交给spring容器去管理,想通过自己new的方式去实例化,以便自己更好的去维护这个对象。

这里非SPRING管理的对象,即自己实例化的对象,用A来代替,SPRING管理的对象用B来代替

在网上找了很久,最终搞定了,这里先说一个弯路:

ApplicationContext context = new ClassPathXmlApplicationContext(
                "classpath*:spring/spring-*.xml");
        return (CommonService) context.getBean("commonService");
如上图所示,A类想引用B类,于是在A类中写了如上的方法来获取B类,启动项目后发现,一旦引用B类时,spring的所有对象就会再次实例化,通过JVM监控发现,对象快要撑爆了,果断放弃,说明如上方法和WEB容器启动加载不是共享的,是独立的,WEB容器启动加载了spring的所有对象,上面方法在被引用时又加载了,这就重复了,引用多少次,就重复多少次,巨坑啊!!!!


找寻spring容器的方法,从spring容器里去拿一个刚刚被spring容器实例化的对象,这样就不会重复加载了,拿的是实例化后的共享的一个对象

定义一个类实现自BeanFactoryAware接口

public class ServiceLocator
        implements BeanFactoryAware {

    private static BeanFactory beanFactory = null;
    private static ServiceLocator serviceLocator = null;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        ServiceLocator.beanFactory = beanFactory;
    }

    public BeanFactory getBeanFactory() {
        return beanFactory;
    }

    public static ServiceLocator getInstance() {
        if (serviceLocator == null) {
            serviceLocator = (ServiceLocator) beanFactory.getBean("serviceLocator");
        }
        return serviceLocator;
    }

    public static Object getService(String serviceName) {
        return beanFactory.getBean(serviceName);
    }

}
这样在A类中,如果要引用B类的话,通过上述类的静态方法getService即可,将bean的名字传入
private CommonService getCommonService() {
        /*@SuppressWarnings("resource")
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "classpath*:spring/spring-*.xml");
        return (CommonService) context.getBean("commonService");*/
        return (CommonService) ServiceLocator.getService("commonService");
    }
如上,亲测成功


这样,非SPRING管理对象和SPRING管理对象就完美的结合到了一起




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

非spring管理的类实例如何托管给spring容器管理

/** * 非spring管理的类实例如何托管给spring容器管理 * * 下面是摘自spring文档 . * pdf版本:spring-framework-reference4.1.3....

普通类中引用spring 容器管理的bean

今天遇到一个问题,在webservice接口中去注入spring管理的类的时候出现了空指针的问题,但是呢,这个webservice类并没有交给spring去做统一管理,那么要怎么注入到spring的b...

spring3将普通的java类纳入到spring的容器中进行管理

@Configuration public class CategoryUtil { public static ICategoryService categoryService; priv...

SPRING容器外访问SPRING

在JSP或者SERVLET外访问SPRING也是很常见的.ApplicationContext是Spring的容器环境,通过ApplicationContext对象可以访问所有配置的bean。  ...

在spring 中如果使用new创建一个对象时 这个对象将不在受spring管理器管理

文章如标题具体如下 比如现在有一个service 层 package com.zyc.service.impl; import javax.annotation.Resource; im...

Spring 使new方法创建的对象可以引用spring管理的bean.

当为遗留系统加入spring时,经典问题就是遗留系统需要引用spring管理的bean。幸好spring有机制可以处理这些。 建一个类实现ApplicationContextAware接口,有一个引...
  • xpmars
  • xpmars
  • 2013年11月05日 13:40
  • 3363

手动创建(new)对象,使用spring容器中的bean(ServletContext)。

场景:一个不受spring管理的静态工厂方法,根据传入的参数不同,返回不同的实现类对象(关键点:实现类对象需要使用spring容器中的数据访问层对象dao或mapper)。 疑难点:如何从spring...

非spring托管对象如何获取到spring托管对象

非spring托管对象要获取到spring托管对象,主要是对ApplicationContext的获取   总共可以分为以下四种方式获取ApplicationContext: 一,通过sprin...

Spring如何管理Java普通类(Java类获取Spring容器的bean)

Spring如何管理Java普通类 Java类获取Spring容器的bean 获取spring的ApplicationContext

非WEB工程怎么在main方法中加载spring容器

非WEB工程怎么在main方法中加载spring容器
  • whh743
  • whh743
  • 2016年12月16日 10:40
  • 4425
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Spring】非SPRING管理的对象要引用SPRING容器管理的对象?对象之间如何引用?
举报原因:
原因补充:

(最多只允许输入30个字)