حقن التبعية مع منشئ الحجج
-
26-12-2019 - |
سؤال
لدي EJB على النحو التالي:
public class Bar() {
private String s;
public Bar() {
this.s = "bar";
}
@Inject public Bar(String s) {
this.s = s;
}
}
كيف يمكن حقن هذا الفول باستخدام arg-منشئ إلى آخر
Foo
الفصل ؟ثم ، تحديد
Foo
الفئة EJB ، بهدف تنفيذ دي بالنسبة إلى فئة أخرى (على سبيل المثال ، WebServlet).كيف يمكنني حقنFoo
فئة سبيل المثال عن طريق تمريرString
إلى إعداد بشكل صحيحBar
arg-منشئ كما الداخلية-التبعية?هل هناك طريقة أفضل لتحديد
Bar
من أجل تحقيق النقاط أعلاه ؟
المحلول
المشروح حقن منشئ يقول CDI التي كلما شخص يطلب مثيل شريط ليتم حقنه ، فإنه يجب استخدام منشئ مع وضع علامة @Inject.
وأول هذه الحاوية ثم يحاول أن يحصل الحالات المطلوبة منشئ المعلمات فشل لأنه لا يمكن التعامل مع "السلسلة".أنها فقط لا تعرف السلسلة التي تعنيه.
لديك لمساعدة حاوية حل التبعية باستخدام منتج تصفيات أن أقول له ماذا سلسلة تريد.أنا فقط أعطيك أبسط الحلول الممكنة هنا:
public class Bar {
@Inject
public Bar(@Named("myString") String s) {
this.s = s;
}
}
ثم في فصل آخر (لا يجب أن يكون فئة مختلفة ، ولكن أكثر من ذلك بكثير للقراءة):
public class MyStringProducer {
@Produces
@Named("myString")
public String getMyString() {
return ...; // whatever you want ... read JSON, parse properties, randomize ...
}
}
نصائح أخرى
@Inject
يعمل فقط عندما يتم حقن "managed
"الكائنات.سلسلة لا تمكن الكائن ، وبالتالي هذا لن;ر العمل.
ومع ذلك ، فإن المثال التالي يجب أن تعمل (لقد استخدمت الربيع هنا.استخدام دي initializaton رمز وفقا المكتبة كنت تستخدم):
@Named
public class Foo {
@Inject
Bar bar;
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
Foo foo = (Foo)ctx.getBean("foo");
System.out.println(foo.bar.getString());
}
}
@Named
public class Bar {
private String s;
public Bar() {
this.s = "bar";
}
@Inject
public Bar(Bar1 bar1) {
this.s = bar1.getS();
}
public String getString() {
return s;
}
}
@Named
class Bar1 {
private String s="bar1";
public String getS() {
return s;
}
}