2010-12-27 34 views
41

Do kiến ​​trúc trình cắm thêm, tôi đang cố gắng thêm bean lập trình vào webapp của tôi. Tôi có một bean Spring được tạo thông qua chú thích @Component và tôi đang triển khai giao diện ApplicationContextAware.Thêm Bean theo cách lập trình vào ngữ cảnh ứng dụng web mùa xuân

chức năng ghi đè lên tôi trông như thế này:

@Override 
public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException { 

    // this fails 
    this.applicationContext = (GenericWebApplicationContext) applicationContext; 
} 

Về cơ bản, tôi không thể tìm ra cách để thêm một bean đến đối tượng applicationContext trao cho setApplicationContext. Bất cứ ai có thể cho tôi biết làm thế nào tôi đang đi về điều này một cách sai lầm?

Ok, đây là những gì tôi đã kết thúc với là giải pháp:

@Override 
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdr) 
     throws BeansException { 
    BeanDefinition definition = new RootBeanDefinition(
      <My Class>.class); 

    bdr.registerBeanDefinition("<my id>", definition); 
} 

Trả lời

34

Trong mùa xuân 3.0 bạn có thể làm đậu của bạn thực hiện BeanDefinitionRegistryPostProcessor và thêm đậu mới qua BeanDefinitionRegistry.

Trong các phiên bản trước của mùa xuân, bạn có thể thực hiện tương tự trong BeanFactoryPostProcessor (mặc dù bạn cần phải đúc BeanFactory đến BeanDefinitionRegistry, điều này có thể không thành công).

+7

cảm ơn bạn. tôi đoán phần khó nhất là biết phải tìm gì. – user146714

+1

Hãy chú ý rằng theo [JavaDoc] (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/beans/factory/config/BeanPostProcessor.html): 'Một BeanFactoryPostProcessor có thể tương tác với và sửa đổi các định nghĩa bean, nhưng không bao giờ các cá thể đậu. Làm như vậy có thể gây ra hiện tượng đậu sớm, vi phạm vật chứa và gây ra các tác dụng phụ không mong muốn. Nếu cần tương tác với cá thể bean, hãy xem xét việc triển khai BeanPostProcessor thay thế.' – dgiffone

+0

Phải làm gì với 'BeanDefinitionRegistryPostProcessor'? Giả sử tôi đã viết lớp này. Tiếp theo là gì? Làm thế nào để kích hoạt nó? – Dims

8

Tại sao bạn cần nó thuộc loại GenericWebApplicationContext?
Tôi nghĩ bạn có thể làm việc với bất kỳ loại ApplicationContext nào.

Thông thường, bạn sẽ sử dụng một phương pháp init (ngoài phương pháp setter của bạn):

@PostConstruct 
public void init(){ 
    AutowireCapableBeanFactory bf = this.applicationContext 
     .getAutowireCapableBeanFactory(); 
    // wire stuff here 
} 

Và bạn sẽ dây đậu được sử dụng một trong hai

AutowireCapableBeanFactory.autowire(Class, int mode, boolean dependencyInject)

hoặc

AutowireCapableBeanFactory.initializeBean(Object existingbean, String beanName)

28

Đây là một mã đơn giản:

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 
beanFactory.registerSingleton(bean.getClass().getCanonicalName(), bean); 
Các vấn đề liên quan