2012-12-12 18 views
7

Tôi đã gặp phải sự cố trong đó trình tự giải trình tự Bean diễn ra. Hiện nay Bean3 từ bên dưới đang chạy một bộ đệm dựa trên bộ nhớ cache hoạt động, và Bean 1 truy vấn đối với bộ nhớ cache mới được tạo ra bằng cách sử dụng Proxy Bean2. Ưu tiên cho Bean3 và Bean 2 được khởi tạo hoàn toàn trước khi Bean1 được khởi tạo, tức là khi thùng chứa Spring xuất hiện. Các bean này nằm trong các JAR riêng biệt và tham chiếu Bean2 vào Bean1 không sử dụng Autowired. Thay vào đó, một trình định vị dịch vụ cho nó một tham chiếu. Chúng tôi đang sử dụng Spring 2.5.2 và không sử dụng XML để tạo hạt đậu. Bất kỳ trợ giúp nào được đánh giá cao!Yêu cầu khởi tạo hạt đậu mùa xuân

  • JAR1 (dự án Spring)

    @Service ("bean3") 
    public class Bean3 implements ApplicationListener { 
        public void onApplicationEvent() { 
         //load data from DB and populate cache      
        } 
        public void getCache(){ 
        //get data from cache 
        } 
    

    }

    @Service ("bean2") 
    public class Bean2 { 
    @Autowired 
    private Bean3 bean3; 
        private void methodA(){ 
        bean3.getCache(); 
        } 
    } 
    
  • JAR2 (dự án Non-Xuân)

    public class Bean1{ 
    Bean2 bean2 = SpringServiceLocator.getBean("bean2") 
        public void methodB(){ 
        bean2.methodA(); 
        } 
    } 
    
+0

Bạn có đang sử dụng tính năng tự động xây dựng dựa trên cơ sở không? – Scott

+0

Chúng tôi đã bật chế độ tự động phát hiện trong JAR1 để tự động phát. – Noosphere

+0

Nó có khả thi để làm cho Bean1 phụ thuộc vào Bean2 (hoặc tạo ra một chuỗi phụ thuộc?) Khi nào phương thức từ Bean1 được gọi là? –

Trả lời

1

Nếu tôi hiểu đúng, bạn đang cố gắng thực hiện một số logic khi khởi động ứng dụng (context init).

Nếu đúng như vậy, tôi khuyên bạn nên sử dụng BeanPostProcessor, để thực hiện bất kỳ hoạt động đặc biệt nào khi khởi động ứng dụng.

public class MyBeanPostProcessor implements BeanPostProcessor { 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) 
      throws BeansException { 

     .. **perform special things** 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) 
      throws BeansException { 
     ..**perform special things** 
     return bean; 
    } 
} 

Đừng quên nói với mùa xuân về bài vi xử lý của bạn

<context:component-scan base-package="some.package" /> 
<bean class="some.package.MyBeanPostProcessor" 

Để biết thêm thông đọc ở đây http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s07.html

Tôi hy vọng điều này sẽ giúp.

0

có lẽ homegrew Dịch vụ xuân locator bạn cần một tín hiệu như dưới đây

 Lock l = new ReentrantLock(); 
     Condition springready = l.newCondition(); 

     l.lock(); 
     try { 
      while (READY_FLAG) 
       springready.await(); 

      ... 

     } finally { 
      l.unlock(); 
     } 

ngoài

bạn có thể nghe ContextRefreshedEvent thay đổi READY_FLAG và tín hiệu 'springready'

+0

tôi không thể chia sẻ mã mà chúng tôi đang sử dụng vì một số lý do, nhưng nó giống như vậy – farmer1992