2016-02-03 20 views
6

Có cách nào có lập trình để tìm ra lớp Cấu hình hoặc tệp xml nào đã tạo một bean Spring không? Thay vì đào qua mã để tìm ra.Có cách nào để tìm hiểu cách tạo bean Spring?

+0

Một khi tôi đã phải gỡ rối vấn đề tương tự. Có một giai đoạn mà Spring đọc các định nghĩa bean từ nhiều nguồn khác nhau. Bạn có thể đặt các điểm ngắt điều kiện trong hàm tạo của các định nghĩa bean này và bắt một thời điểm khi nó được tạo đầu tiên. Sau đó, bạn sẽ thấy nguồn bằng cách di chuyển lên trên trong stacktrace. – AdamSkywalker

+0

@AdamSkywalker Yeah Tôi đã hy vọng sẽ có một cách dễ dàng hơn thế. – Glide

Trả lời

4

Phần sau minh họa cách lấy nguồn của cấu hình bằng tên bean.

  1. Lấy nét đậu cho đậu: ctx.getBeanDefinition ("beanName")
  2. Gọi getResourceDescription().

Dưới đây là ví dụ hoạt động thiết lập bean dựa trên @Configuration được gọi là 'a' được định nghĩa trong AppConfig và một bean XML có tên "xmlBean" được định nghĩa trong SpringBeans.xml. Trong mỗi trường hợp, lớp @Configuration nguồn hoặc tệp xml được hiển thị chính xác.

Đây là lớp cấu hình java thiết lập bean = a và cũng tải tệp cấu hình XML SpringBeans.xml chứa bean = xmlBean.

@Configuration 
@ImportResource({"classpath:SpringBeans.xml"}) 
@ComponentScan(basePackages = "com.test.config") 
public class AppConfig { 

    @Bean 
    public A a() { 
     return new A(); 
    } 

} 

Đây là đậu quy định tại SpringBeans.xml:

<bean id="xmlBean" class="com.test.HelloWorld"> 
    <property name="name" value="XML" /> 
</bean> 

Đây là mã đơn giản trong đó sử dụng getResourceDescription():

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 

    ctx.register(AppConfig.class); 
    ctx.refresh(); 

    BeanDefinition javaConfigBeanDefinition = ctx.getBeanDefinition("a"); 
    System.out.println("Creation class for a=" + javaConfigBeanDefinition.getResourceDescription()); 

    BeanDefinition xmlBeanDefinition = ctx.getBeanDefinition("xmlBean"); 
    System.out.println("Creation XML file for xmlBean=" + xmlBeanDefinition.getResourceDescription()); 

Output:

Creation class for a=com.test.config.AppConfig 
Creation XML file for xmlBean=class path resource [SpringBeans.xml] 

Có lẽ một cách thực tế hơn là tạo ra một BeanDefinitionRegistryPostProcessor và yêu cầu thông tin đó:

@Component 
public class FindBeanConfigLocation implements BeanDefinitionRegistryPostProcessor { 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException { 
    } 

    @Override 
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 
     BeanDefinition javaConfigBeanDefinition = registry.getBeanDefinition("a"); 
     System.out.println("Creation class for a=" + javaConfigBeanDefinition.getResourceDescription()); 

     BeanDefinition xmlBeanDefinition = registry.getBeanDefinition("xmlBean"); 
     System.out.println("Creation XML file for xmlBean=" + xmlBeanDefinition.getResourceDescription()); 
    } 

} 
Các vấn đề liên quan