Tôi chỉ mới bắt đầu với khái niệm Spring IOC. Tôi thường thấy hầu hết các ví dụ được tìm thấy trên internet sử dụng mã để lấy đối tượng.Cách tránh sử dụng ApplicationContext.getBean() khi triển khai Spring IOC
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Hello hello = (Hello) appContext.getBean("hello");
Là một tài liệu tham khảo từ những câu hỏi 1 và 2 trong stackoverflow. Tôi đã suy ra rằng, không cần thiết phải sử dụng appContext.getBean ("hello") trong mã được coi là thực hành không tốt. Ngoài ra, không được khuyến khích nữa. Đúng tôi ở đây, Nếu suy luận của tôi là sai.
Theo quan điểm đó, tôi đã thực hiện các thay đổi trong dự án của mình cho phù hợp. Dưới đây là applicationContext.xml tôi
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="utilClassRef" class="org.hd.derbyops.DUtils" lazy-init="false" />
<bean id="appContext" class="org.hd.derbyops.ContextProvider" lazy-init="false">
<property name="utils" ref="utilClassRef" />
</bean>
</beans>
My contextProvider Lớp Mã
public class ContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx;
/**
* Objects as properties
*/
private static DUtils utils;
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
ctx = appContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
public static DUtils getUtils() {
return utils;
}
public void setUtils(DUtils dUtilsRef) {
utils = dUtilsRef;
}
}
Ví dụ, hãy xem xét một lớp Một mà phụ thuộc vào org.hd.derbyops.DUtils. Tôi đang sử dụng các dòng mã sau
ContextProvider.getUtils();
inorder để có được DUtils Object trong lớp A, như vậy tránh được việc sử dụng của ApplicationContext.getBean()
bất cứ nơi nào trong mã của tôi.
Giả sử, nếu tôi có 10 lớp và lớp A của tôi phụ thuộc vào tất cả các lớp, đối tượng của chúng sẽ được tạo và truy cập mà không cần sử dụng ApplicationContext.getBean()
. Trong trường hợp đó cũng vậy, như đã thực hiện ở trên, tôi có một ý nghĩ về việc tạo các thuộc tính của lớp ContextProvider theo sau bởi setter và getter của thuộc tính đó, trong đó trong get<PropertyName>
là tĩnh. Vì vậy, tôi có thể sử dụng nó bất cứ nơi nào tôi cần một đối tượng, như thế này
ContextProvider.get<PropertyName>;
Đây là câu hỏi ngắn gọn của tôi. Thứ nhất, cách tiếp cận của tôi có đúng không? Nếu nó đúng, tải tất cả các hạt lúc khởi động, nó sẽ không phải là một kẻ giết người hiệu suất? Làm thế nào bạn sẽ làm điều đó trong các ứng dụng của bạn mà không gọi getBean ít nhất một lần?
Nếu bạn đã thiết kế một ứng dụng web &, bạn đã triển khai Spring IOC, mà không cần sử dụng ApplicationContext.getBean()
trong bất kỳ mã nào. Bạn làm điều đó như thế nào?
Lưu ý: có sự tham khảo các câu hỏi khác được gắn thẻ trên
Calling ApplicationContext.getBean() không phải là Inversion of Control!
Bạn đang sử dụng Spring MVC hoặc cố gắng sử dụng các servlet cơ bản? –
Tôi không sử dụng Spring MVC, chỉ cần sử dụng nó cho IOC – srk
Nói chung, * ai đó * sẽ cần lấy một bean từ 'ApplicationContext'. Lý tưởng nhất, nó chỉ được gọi là một lần, và nó sẽ là bởi đối tượng bootstrapping ... –