2017-05-05 33 views

回答

0

您可以通过构造函数Spring bean的注入,是这样的:

@Service 
class Bean { 
    ... 
} 

class NotBean { 

     private Bean bean; 

     public NotBean(Bean bean) { 
     this.bean = bean; 
     } 

     // your stuff (handle events, etc...) 
} 
+0

我没有在其他NotBean是如何被实例化,因此,我不能简单地通过bean的引用给它控制... – Walter

+0

你可以从NotBean延伸? –

2

你唯一的选择是使用一个静态方法来使您的应用程序的Spring上下文,使得不被管理的对象Spring可以使用它来获取它所需的托管bean的引用。

  1. 从上下文的包装开始。创建一个需要在其构造函数中引用上下文的常规托管bean。参考被分配到一个静态类领域的,也有静态的getter:

    @Service 
    class ContextWrapper { 
    
        private static ApplicationContext context; 
    
        @Autowired 
        public ContextWrapper(ApplicationContext ac) { 
         context = ac; 
        } 
    
        public static ApplicationContext getContext() { 
         return context; 
        } 
    
    } 
    
  2. 使用静态吸气以访问对象上下文中未由Spring管理,并得到参考使用方法豆在上下文中可用:

    SomeBean bean = ContextWrapper.getContext().getBean("someBean", SomeBean.class); 
    // do something with the bean 
    
  3. 你需要的最后一件事是从Spring bean的通信信道的非托管对象。例如,SomeBean可以公开一个setter,它将接受非管理对象作为参数,并将该引用存储在字段中供将来使用。对象mast使用上面提到的静态上下文访问器来获取对托管bean的引用,并使用setter来让bean知道它的存在。

    @Service 
    class SomeBean { 
    
        // ... your bean stuff 
    
        private SomeClass someclass; 
    
        public void setSomeClass(Someclass someclass) { 
         this.someclass = someclass; 
        } 
    
        private void sendEventToSomeClass() { 
         // communicate with the object not managed by Spring 
         if (someClass == null) return; 
         someClass.sendEvent(); 
        } 
    
    } 
    
+0

我如何确保上下文不为空或不完全加载?我可以依赖getContext()将返回完整的春天上下文,为什么? – user7294900

+0

如果您的Spring应用程序已启动,则必须正确创建上下文。你唯一需要记住的是你不应该在bean的构造函数中使用'getContext()'方法,因为bean的构建是创建上下文的一部分。 –

+0

当从一个**常规(非spring)类**调用获取一个bean时,我可以假设spring上下文已经启动了吗?是否需要添加检查/函数以确保spring上下文不为null或未完全加载? – user7294900

相关问题