2009-05-14 7 views
8

Tôi muốn viết một ứng dụng độc lập với IOC, làm cách nào để sử dụng tiêm phụ thuộc vào lò xo trong đó? Tôi đang sử dụng JIdea. Có hỗ trợ mùa xuân 2.5 nhưng tôi muốn sử dụng mùa xuân 3.0 ở đây là cách tôi đã cố gắng!Spring- Làm thế nào để sử dụng Spring Dependency Injection để viết một ứng dụng Java độc lập

tôi kinh nghiệm trong sử dụng Spring MVC, chúng tôi có thể tiêm phụ thuộc có trong một WebApplicationContext nhưng làm cách nào để tiêm phụ thuộc trong một ứng dụng độc lập

Tôi cố gắng này

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"com\\ttg\\xmlfile.xml"});

nhưng tôi không thể thấy rằng các phụ thuộc được tiêm bởi các hạt được xác định ở đó (trong th e XML file) Tôi đặt mã trên vào phương thức chính và hai định nghĩa bean cho hai đối tượng, trong một hàm tạo của lớp Java, tôi đã sử dụng đối tượng của lớp khác - được tiêm vào đối tượng này - và được gọi là phương thức sẽ in một số điều nhưng nó đã không làm việc Tôi nghĩ rằng mã trên tạo ra tất cả các phụ thuộc và tiêm chúng, nhưng nó không có vẻ như là

Làm thế nào để sử dụng đúng cách IOC Springs, tiêm phụ thuộc trong ứng dụng độc lập của tôi mà không chứa một WebApplicationContext?

Vui lòng đề cập các bước.

+0

sau đó tôi thấy rằng tôi không thêm thư viện là lý do --- antlr-3.0.1.jar --- – Buddhi

+0

Buddhi

Trả lời

17

giả sử bạn có:

class Bean1 { 
    Bean2 bean2; 
} 

class Bean2 { 
    String data; 
} 

tập tin context.xml

<bean id="bean1" class="Bean1"> 
    <property name="bean2" ref="bean2" /> 
</bean> 

<bean id="bean2" class="Bean2" /> 

thì đây nên là đúng

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"context.xml"}); 
Bean1 bean1 = (Bean1) context.getBean("bean1"); 

// bean1.bean2 should not be null here. 
0

Bạn có đang gọi số context.getBean("beanName") để nhận được tham chiếu đến bean hay bạn đang thực hiện new SomeClass()? Nếu bạn làm điều đó thông qua getBean() thì các thuộc tính được chèn phải được đặt.

Ngoài ra, hãy đảm bảo sử dụng cùng một nhà máy sản xuất hạt (thể hiện ClassPathXmlApplicationContext) để truy xuất tất cả các hạt của bạn. Điều này rất có thể là tĩnh cuối cùng và được sử dụng bởi toàn bộ ứng dụng.

1

Làm cách nào bạn xác nhận rằng hạt của bạn không được kết nối đúng cách? Một vấn đề phổ biến là tệp cấu hình xml không được đặt đúng vị trí. Bạn có thể cung cấp cho chúng tôi một số thông tin khác như bố cục dự án của bạn và mã bạn sử dụng để lấy các hạt từ thùng chứa không?

0

Nếu bạn thêm log4j khai thác gỗ để ứng dụng của bạn, bạn nên nhìn thấy một loạt các thông điệp sắp ra sẽ cho bạn biết rất nhiều về những gì mùa xuân là và không làm. Nếu bạn không có phản hồi đó, bạn đang ở trong bóng tối. Bạn có thể có thể tìm ra câu trả lời chỉ bằng cách lấy thêm thông tin từ Spring từ log4j.

9

bạn có thể sử dụng hỗ trợ autowiring được cung cấp bởi mùa xuân, để chèn phụ thuộc (và có thể áp dụng bộ xử lý bài) cho một đối tượng không phải là một phần của ngữ cảnh ứng dụng.

Trong trường hợp của bạn, đối tượng này là ứng dụng độc lập của bạn.

Đây là cách để đạt được điều này. Trong ví dụ này, tôi sử dụng @Autowired (cho b1), DI truyền thống (cho b2) và móc khởi tạo cho b3. Hỗ trợ tự động với chú thích giả sử bạn đã xác định trình xử lý hậu kỳ thích hợp trong ngữ cảnh ứng dụng của bạn (ví dụ: bằng cách khai báo <context:annotation-config/>).

public class StandaloneApp implements InitializingBean { 
    @Autowired private Bean1 b1; 
    private Bean2 b2; 
    private Bean3 b3; 

    public void afterPropertiesSet() throws Exception { 
    this.b3 = new Bean3(b1, b2); 
    } 

    public void setB2(Bean2 b2) { 
    this.b2 = b2; 
    } 

    public static void main(String... args) { 
    String[] locations = // your files relative to the classpath 
    ApplicationContext ac = new ClasspathXmlApplicationContext(locations); 
    // or use FileSystemXmlApplicationContext if the files are not in the classpath 

    StandaloneApp app = new StandaloneApp(); 
    AutowireCapableBeanFactory acbf = ac.getAutowireCapableBeanFactory(); 
    acbf.autowireBeanProperties(app, AUTOWIRE_BY_NAME, false); 
    acbf.initializeBean(app, "standaloneApp"); // any name will work 
    } 
} 

Trong ví dụ này, tất cả b1, b2 và b3 không được rỗng (giả sử b1 và b2 có trong ngữ cảnh ứng dụng của bạn).

Tôi chưa thử nghiệm (có thể thậm chí không biên dịch do một số lỗi đánh máy), nhưng ý tưởng nằm trong 3 dòng cuối cùng. Xem javadocs cho AutowireCapableBeanFactory và các phương pháp được đề cập để xem chính xác những gì sẽ xảy ra.

0

bạn có thể sử dụng lệnh @Autowired

2

Nếu bạn thích (chủ yếu) java tinh khiết, bạn có thể sử dụng java cấu hình:

@Configuration 
pubic class MyConfig { 

    @Bean 
    public Bean1 bean1() { return new Bean1(); } 

    @Bean 
    public Bean2 bean2() { return new Bean2(bean1()); } 
} 

Và sau đó để nhanh chóng:

ApplicationContext ctx = 
    new AnnotationConfigApplicationContext(MyConfig.class); 

Giữ trong tâm trí có một số thứ mà cấu hình điều khiển chú thích thuần túy chưa hỗ trợ (chẳng hạn như những thứ như tx: hướng chú thích), mà bạn có thể cần một số mã keo xml.

<beans> 
    <tx:annotation-driven /> 
    <context:annotation-config/> 
    <bean class="MyConfig"/> 
</beans> 

Và sau đó sử dụng phương pháp dựa trên xml chuẩn để tạo ApplicationContext (như ClasspathXmlApplicationContext, hoặc trình tải ngữ cảnh mùa xuân, v.v ...).