Tôi muốn tạo một chiến lược quản lý thuộc tính thích hợp trong một ứng dụng web java chuyển tiếp trên google guice dưới dạng khung DI.Google Guice Properties Management
Tôi muốn có một cơ chế trả lời 3 yêu cầu sau:
- Tôi muốn để có thể tiêm các thuộc tính sử dụng Guice (@Named)
- Tôi muốn để có thể truy cập tài sản Theo cách tĩnh,
- Cơ chế phải hỗ trợ ưu tiên các thuộc tính, có nghĩa là một thuộc tính có thể được bao bọc trong cuộc chiến được triển khai với một giá trị nhất định nhưng nó cũng có thể dư thừa ở cấp hệ thống đích hoặc hệ thống tệp cục bộ (của máy đích) Tôi triển khai trên), trong trường hợp này giá trị trong chiến tranh sẽ bị ghi đè bởi giá trị thứ tồn tại trong máy mục tiêu.
Tôi tin rằng đây là yêu cầu tiêu chuẩn. Bây giờ, bằng cách sử dụng chất kết dính tiêu chuẩn guice tôi có thể dễ dàng có được yêu cầu đầu tiên nhưng không phải là hai khác. Để có được hai người kia Tôi tạo ra lớp riêng tôi nào sau đây:
- Wraps và đưa ra phương án ràng buộc của Guice (những người liên kết với tài sản) Ví dụ:
public static void bindString(AnnotatedBindingBuilder<String> binder, String property, String defaultValue) { binder.annotatedWith(Names.named(property)).toInstance(getProperty(property, defaultValue)); }
đâu phương thức getProperty biết cách xử lý các thuộc tính của tôi (lấy giá trị từ cấp độ chiến tranh hoặc hệ thống) và phơi bày các thuộc tính một cách tĩnh. Vì vậy, về cơ bản miễn là tôi đang sử dụng tiện ích này mà tôi tạo cho các thuộc tính ràng buộc tôi là tốt, nó bao gồm tất cả các yêu cầu của tôi, nhưng một khi tôi sử dụng các ràng buộc guice tiêu chuẩn tôi đang mất yêu cầu thứ hai và thứ ba.
Có cách nào để ghi đè ràng buộc guice và nhận được tất cả 3 yêu cầu đó không?
Khi tôi đã có cùng một challange trong một ứng dụng dựa trên mùa xuân và khá dễ dàng. Tôi thực hiện ApplicationContextInitializer với phương thức sau:
@Override public void initialize(ConfigurableWebApplicationContext ctx) { PropertySource<Map<String, Object>> localProps = null; try { localProps = new ResourcePropertySource(new ClassPathResource(LOCAL_PROPERTIES_FILE_NAME)); } catch (IOException e) { LOG.fatal("Could not load local properties from classpath " + LOCAL_PROPERTIES_FILE_NAME); return; } LOG.info("Loaded configuration from classpath local file " + LOCAL_PROPERTIES_FILE_NAME); ctx.getEnvironment().getPropertySources().addFirst(localProps); }
vì vậy đây đã cho tôi một cách để thêm các thuộc tính địa phương với ưu tiên cao nhất để Môi trường của tôi. Trong trường hợp chồng chéo với các đặc tính chiến tranh, những người địa phương có ưu tiên cao hơn. Ngoài ra, tôi tiếp xúc với Môi trường của mình tĩnh nên tôi có quyền truy cập tĩnh vào các thuộc tính của mình (đối với các dịch vụ không được quản lý bởi vùng chứa, phần lớn là cũ).
Làm cách nào để đạt được điều này bằng guice?
Ý anh là gì, mà bạn muốn truy cập vào các thuộc tính trong một cách tĩnh? Điều đó có nghĩa là bạn có các trường hợp sử dụng mà bạn muốn truy cập vào một thuộc tính cụ thể, nhưng bạn không biết cho đến khi chạy tài sản nào bạn muốn truy cập? –
Tôi muốn có thể truy cập vào một tài sản bằng cách sử dụng một cái gì đó như: SomeClass.getProperty ("my.property"); Điều này sẽ hữu ích cho các lớp không được quản lý bởi guice (thường là thường) và vẫn cần quyền truy cập vào các thuộc tính của tôi – forhas