JavaRush /جاوا بلاگ /Random-SD /انحصار انجيڪشن ۾ هڪ مختصر سفر يا "ٻيو ڇا آهي CDI؟"
Viacheslav
سطح

انحصار انجيڪشن ۾ هڪ مختصر سفر يا "ٻيو ڇا آهي CDI؟"

گروپ ۾ شايع ٿيل
بنياد جنهن تي سڀ کان وڌيڪ مشهور فريم ورڪ هاڻي تعمير ڪيا ويا آهن انحصار انجڻ. مان اهو ڏسڻ جي صلاح ڏيان ٿو ته سي ڊي آئي جي وضاحت هن بابت ڇا چوي ٿي، اسان وٽ ڪهڙيون بنيادي صلاحيتون آهن ۽ اسان انهن کي ڪيئن استعمال ڪري سگهون ٿا.
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

تعارف

مان هن مختصر جائزو کي اهڙي شيءِ لاءِ وقف ڪرڻ چاهيان ٿو جيئن سي ڊي آءِ. هي ڇا آهي؟ سي ڊي آئي جو مطلب آهي حوالن ۽ انحصار انجڻ. هي هڪ جاوا EE وضاحت آهي جيڪا بيان ڪري ٿي انحصار انجکشن ۽ حوالن. معلومات لاء، توهان ويب سائيٽ تي ڏسي سگهو ٿا http://cdi-spec.org . جيئن ته CDI هڪ وضاحت آهي (هڪ وضاحت ته اهو ڪيئن ڪم ڪرڻ گهرجي، انٽرفيس جو هڪ سيٽ)، اسان کي ان کي استعمال ڪرڻ لاء هڪ عمل درآمد جي ضرورت پوندي. اهڙن عملن مان هڪ آهي Weld - http://weld.cdi-spec.org/ انحصار کي منظم ڪرڻ ۽ هڪ پروجيڪٽ ٺاهڻ لاءِ، اسان Maven استعمال ڪنداسين - https://maven.apache.org تنهن ڪري، اسان Maven انسٽال ڪيو آهي، هاڻي اسان ان کي عملي طور تي سمجھندو، ته جيئن خلاصو نه سمجھي. هن کي ڪرڻ لاء، اسان Maven استعمال ڪندي هڪ منصوبو ٺاهينداسين. اچو ته ڪمانڊ لائن کوليون (ونڊوز ۾، توھان Win+R استعمال ڪري سگھوٿا ”رن“ ونڊو کولڻ ۽ سي ايم ڊي کي هلائڻ لاءِ) ۽ ماون کان پڇو ته اسان لاءِ سڀ ڪجھ ڪري. ان لاءِ، Maven هڪ تصور آهي جنهن کي آرڪيٽائپ سڏيو ويندو آهي: Maven Archetype .
انحصار انجيڪشن ۾ هڪ مختصر سفر يا
ان کان پوء، سوالن تي " هڪ نمبر چونڊيو يا فلٽر لاڳو ڪريو " ۽ " منتخب ڪريو org.apache.maven.archetypes:maven-archetype-quickstart version " بس Enter کي دٻايو. اڳيون، داخل ڪريو پروجيڪٽ جي سڃاڻپ ڪندڙ، نام نهاد GAV (ڏسو نالونگ ڪنوينشن گائيڊ ).
انحصار انجيڪشن ۾ هڪ مختصر سفر يا
منصوبي جي ڪامياب ٺاھڻ کان پوء، اسان لکت ڏسندا "BUILD SUCCESS". ھاڻي اسان پنھنجي پروجيڪٽ کي پنھنجي پسنديده IDE ۾ کوليون ٿا.

هڪ پروجيڪٽ ۾ CDI شامل ڪرڻ

تعارف ۾، اسان ڏٺو ته CDI هڪ دلچسپ ويب سائيٽ آهي - http://www.cdi-spec.org/ . هتي هڪ ڊائون لوڊ سيڪشن آهي، جنهن ۾ هڪ ٽيبل آهي جنهن ۾ ڊيٽا شامل آهي جيڪا اسان کي گهربل آهي:
انحصار انجيڪشن ۾ هڪ مختصر سفر يا
هتي اسان ڏسي سگهون ٿا ته Maven ڪيئن بيان ڪري ٿو حقيقت اها آهي ته اسان منصوبي ۾ CDI API استعمال ڪندا آهيون. API هڪ ايپليڪيشن پروگرامنگ انٽرفيس آهي، يعني ڪجهه پروگرامنگ انٽرفيس. اسان انٽرفيس سان ڪم ڪريون ٿا ان جي باري ۾ پريشان ٿيڻ جي ته اهو هن انٽرفيس جي پويان ڇا ۽ ڪيئن ڪم ڪري ٿو. API هڪ جار آرڪائيو آهي جيڪو اسان پنهنجي پروجيڪٽ ۾ استعمال ڪرڻ شروع ڪنداسين، اهو آهي، اسان جو پروجيڪٽ هن جار تي منحصر ٿيڻ شروع ٿئي ٿو. تنهن ڪري، اسان جي منصوبي لاء CDI API هڪ انحصار آهي. Maven ۾، ھڪڙو منصوبو بيان ڪيو ويو آھي POM.xml فائلن ۾ ( POM - Project Object Model ). انحصار بيان ٿيل آهن انحصار بلاڪ ۾، جنهن ۾ اسان کي نئين داخلا شامل ڪرڻ جي ضرورت آهي:
<dependency>
	<groupId>javax.enterprise</groupId>
	<artifactId>cdi-api</artifactId>
	<version>2.0</version>
</dependency>
جيئن توهان محسوس ڪيو هوندو، اسان مهيا ڪيل قيمت سان گنجائش بيان نه ڪندا آهيون. اهڙو فرق ڇو آهي؟ هن دائري جو مطلب آهي ته ڪو اسان کي انحصار سان مهيا ڪندو. جڏهن هڪ ايپليڪيشن جاوا EE سرور تي هلندي آهي، ان جو مطلب اهو آهي ته سرور ايپليڪيشن کي سڀني ضروري JEE ٽيڪنالاجيون مهيا ڪندو. هن جائزي جي سادگي جي خاطر، اسان جاوا SE ماحول ۾ ڪم ڪنداسين، تنهنڪري ڪو به اسان کي هن انحصار سان مهيا نه ڪندو. توهان وڌيڪ پڙهي سگهو ٿا انحصار جي دائري بابت هتي: " انحصار جي دائري ". ٺيڪ، اسان وٽ هاڻي انٽرفيس سان ڪم ڪرڻ جي صلاحيت آهي. پر اسان کي پڻ عمل جي ضرورت آهي. جيئن اسان کي ياد آهي، اسان ويلڊ استعمال ڪنداسين. اها دلچسپ ڳالهه آهي ته مختلف انحصار هر جڳهه ڏني وئي آهي. پر اسان دستاويز جي پيروي ڪنداسين. تنهن ڪري، اچو ته پڙهون " 18.4.5. ڪلاس پاٿ سيٽ ڪرڻ " ۽ ائين ڪريو جيئن اهو چوي ٿو:
<dependency>
	<groupId>org.jboss.weld.se</groupId>
	<artifactId>weld-se-core</artifactId>
	<version>3.0.5.Final</version>
</dependency>
اهو ضروري آهي ته ويلڊ جي ٽئين لائين ورجن سي ڊي آئي 2.0 جي حمايت ڪن. تنهن ڪري، اسان هن نسخي جي API تي شمار ڪري سگهون ٿا. هاڻي اسان ڪوڊ لکڻ لاء تيار آهيون.
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

CDI ڪنٽينر جي شروعات

CDI هڪ ميڪانيزم آهي. ڪنهن کي هن ميکانيزم کي ڪنٽرول ڪرڻ گهرجي. جيئن ته اسان مٿي پڙهي چڪا آهيون، اهڙي مينيجر هڪ ڪنٽينر آهي. تنهن ڪري، اسان کي ان کي ٺاهڻ جي ضرورت آهي؛ اهو پاڻ ايس اي ماحول ۾ ظاهر نه ٿيندو. اچو ته اسان جي مکيه طريقي ۾ ھيٺيون شامل ڪريو:
public static void main(String[] args) {
	SeContainerInitializer initializer = SeContainerInitializer.newInstance();
	initializer.addPackages(App.class.getPackage());
	SeContainer container = initializer.initialize();
}
اسان دستي طور تي سي ڊي آئي ڪنٽينر ٺاهيو ڇو ته ... اسان هڪ ايس اي ماحول ۾ ڪم ڪريون ٿا. عام جنگي منصوبن ۾، ڪوڊ سرور تي هلندو آهي، جيڪو ڪوڊ کي مختلف ٽيڪنالاجيون مهيا ڪري ٿو. مطابق، جيڪڏهن سرور مهيا ڪري ٿو CDI، ان جو مطلب اهو آهي ته سرور وٽ اڳ ۾ ئي هڪ CDI ڪنٽينر آهي ۽ اسان کي ڪجهه شامل ڪرڻ جي ضرورت نه هوندي. پر ھن سبق جي مقصدن لاءِ، اسين SE ماحول کي کڻنداسين. ان کان سواء، ڪنٽينر هتي آهي، واضح ۽ سمجھڻ سان. ڇو اسان کي هڪ ظرف جي ضرورت آهي؟ ڪنٽينر اندر ڀاڄيون (CDI ڀاڄيون) هونديون آهن.
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

سي ڊي آئي بينز

تنهن ڪري، ڀاڄيون. هڪ CDI بن ڇا آهي؟ هي هڪ جاوا طبقو آهي جيڪو ڪجهه ضابطن تي عمل ڪري ٿو. اهي قاعدا تفصيل ۾ بيان ڪيا ويا آهن، باب ۾ " 2.2. ڪھڙي قسم جا طبقا بينس آھن؟ ". اچو ته ساڳئي پيڪيج ۾ هڪ CDI بين شامل ڪريون جيئن ايپ ڪلاس:
public class Logger {
    public void print(String message) {
        System.out.println(message);
    }
}
هاڻي اسان هن کي پنهنجي mainطريقي سان سڏي سگهون ٿا:
Logger logger = container.select(Logger.class).get();
logger.print("Hello, World!");
جئين توهان ڏسي سگهو ٿا، اسان نئين لفظ استعمال ڪندي بين ٺاهي نه آهي. اسان سي ڊي آءِ ڪنٽينر کان پڇيو: ”سي ڊي آءِ ڪنٽينر. مون کي واقعي لاگر ڪلاس جو هڪ مثال گهربل آهي، مهرباني ڪري مون کي ڏيو. هن طريقي کي " انحصار ڳولڻ " سڏيو ويندو آهي، اهو آهي، انحصار جي ڳولا. ھاڻي اچو ھڪڙو نئون ڪلاس ٺاھيو:
public class DateSource {
    public String getDate() {
        return new Date().toString();
    }
}
ھڪڙو ابتدائي طبقو جيڪو ھڪڙي تاريخ جي ھڪڙي متن جي نمائندگي ڪري ٿو. اچو ته ھاڻي پيغام ۾ تاريخ جي ٻاھر شامل ڪريو:
public class Logger {
    @Inject
    private DateSource dateSource;

    public void print(String message) {
        System.out.println(dateSource.getDate() + " : " + message);
    }
}
هڪ دلچسپ @Inject تشريح ظاهر ٿيو آهي. جيئن سي ڊي آئي ويلڊ دستاويزن جي باب " 4.1. انجيڪشن پوائنٽس " ۾ بيان ڪيو ويو آهي، هن تشريح کي استعمال ڪندي اسان انجيڪشن پوائنٽ جي وضاحت ڪريون ٿا. روسي ۾، ان کي پڙهي سگهجي ٿو "عملي نقطي". اهي سي ڊي آئي ڪنٽينر طرفان استعمال ڪيا ويندا آهن انحصار کي انجيڪشن ڪرڻ لاءِ جڏهن لوبن کي تيز ڪرڻ. جيئن توهان ڏسي سگهو ٿا، اسان ڪنهن به قدر کي تفويض نه ڪري رهيا آهيون dateSource فيلڊ ۾. ان جو سبب اهو آهي ته سي ڊي آءِ ڪنٽينر سي ڊي آءِ بينز جي اندر اجازت ڏئي ٿو (صرف اهي ڀاڄيون جن کي ان پاڻ انسٽنٽ ڪيو آهي، يعني اهو انتظام ڪري ٿو) ” انحصار انجيڪشن “ استعمال ڪرڻ جي. هي ڪنٽرول آف ڪنٽرول جو هڪ ٻيو طريقو آهي ، هڪ طريقو جتي انحصار ڪنهن ٻئي طرفان ڪنٽرول ڪيو وڃي ٿو بجاءِ اسان واضح طور تي شيون ٺاهي. انحصار انجڻ هڪ طريقو، تعمير ڪندڙ، يا فيلڊ ذريعي ٿي سگهي ٿو. وڌيڪ تفصيلن لاءِ، ڏسو CDI وضاحتن جو باب " 5.5. انحصار انجيڪشن ". اهو طئي ڪرڻ جي طريقيڪار کي لاڳو ڪرڻ جي ضرورت آهي ٽائپسيف ريزوليوشن سڏيو ويندو آهي، جنهن بابت اسان کي ڳالهائڻ جي ضرورت آهي.
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

نالو قرارداد يا ٽائپساف قرارداد

عام طور تي، هڪ انٽرفيس استعمال ڪيو ويندو آهي اعتراض جي قسم جي طور تي لاڳو ڪيو وڃي، ۽ CDI ڪنٽينر پاڻ اهو طئي ڪري ٿو ته ڪهڙي عمل کي چونڊڻ لاء. اهو ڪيترن ئي سببن لاء مفيد آهي، جنهن تي اسين بحث ڪنداسين. تنهنڪري اسان وٽ هڪ لاگر انٽرفيس آهي:
public interface Logger {
    void print(String message);
}
هن جو چوڻ آهي ته جيڪڏهن اسان وٽ ڪو لاگر آهي ته اسان ان کي پيغام موڪلي سگهون ٿا ۽ اهو پنهنجو ڪم پورو ڪري ڇڏيندو. ڪيئن ۽ ڪٿي هن معاملي ۾ دلچسپي نه رکندو آھي. اچو ته ھاڻي لاگر لاءِ ھڪ عمل ٺاھيون:
public class SystemOutLogger implements Logger {
    @Inject
    private DateSource dateSource;

    public void print(String message) {
        System.out.println(message);
    }
}
جئين توهان ڏسي سگهو ٿا، اهو هڪ لاگر آهي جيڪو لکي ٿو System.out. عجيب. هاڻي، اسان جو مکيه طريقو اڳ وانگر ڪم ڪندو. Logger logger = container.select(Logger.class).get(); هي لڪير اڃا تائين لاگر طرفان وصول ڪيو ويندو. ۽ خوبصورتي اها آهي ته اسان کي صرف انٽرفيس کي ڄاڻڻ جي ضرورت آهي، ۽ سي ڊي آئي ڪنٽينر اڳ ۾ ئي اسان لاء عمل درآمد بابت سوچيو آهي. اچو ته چئو ته اسان وٽ هڪ ٻيو عمل آهي جيڪو لاگ ان کي ڪنهن ريموٽ اسٽوريج ڏانهن موڪلڻ گهرجي:
public class NetworkLogger implements Logger {
    @Override
    public void print(String message) {
        System.out.println("Send log message to remote log system");
    }
}
جيڪڏهن اسان هاڻي بغير تبديلين جي اسان جو ڪوڊ هلائيندا آهيون، اسان کي هڪ غلطي ملندي، ڇاڪاڻ ته CDI ڪنٽينر انٽرفيس جي ٻن عملن کي ڏسي ٿو ۽ انھن جي وچ ۾ چونڊ نه ٿو ڪري سگھجي: org.jboss.weld.exceptions.AmbiguousResolutionException: WELD-001335: Ambiguous dependencies for type Logger ڇا ڪجي؟ اتي ڪيترائي variations موجود آهن. سڀ کان سادو آهي @Vetoed تشريح هڪ CDI بين لاءِ ته جيئن CDI ڪنٽينر هن طبقي کي CDI بين جي حيثيت ۾ نه سمجهي. پر اتي ھڪڙو وڌيڪ دلچسپ طريقو آھي. هڪ سي ڊي آئي بين کي "متبادل" طور نشان لڳايو وڃي ٿو بيان ڪيل تشريح استعمال ڪندي @Alternative" 4.7. متبادل " باب ويلڊ CDI دستاويزن جي. هن جو ڇا مطلب آهي؟ هن جو مطلب اهو آهي ته جيستائين اسان ان کي استعمال ڪرڻ لاء واضح طور تي نه چئون، اهو چونڊيو نه ويندو. هي مکڻ جو هڪ متبادل نسخو آهي. اچو ته NetworkLogger bean کي @Alternative طور نشان لڳايو ۽ اسان ڏسي سگھون ٿا ته ڪوڊ ٻيهر عمل ڪيو ويو آهي ۽ SystemOutLogger پاران استعمال ڪيو ويو آهي. متبادل کي چالو ڪرڻ لاء، اسان وٽ لازمي آھي beans.xml فائل . سوال ٿي سگھي ٿو: " beans.xml، مان توھان کي ڪٿي رکان؟ " تنهن ڪري، اچو ته فائل کي صحيح طور تي رکون:
انحصار انجيڪشن ۾ هڪ مختصر سفر يا
جيئن ئي اسان وٽ هي فائل آهي، اسان جي ڪوڊ سان گڏ آرٽيڪل کي " Explicit bean archive " سڏيو ويندو. ھاڻي اسان وٽ 2 الڳ ترتيبون آھن: سافٽ ويئر ۽ xml. مسئلو اهو آهي ته اهي ساڳيا ڊيٽا لوڊ ڪندا. مثال طور، DataSource bean تعريف کي 2 ڀيرا لوڊ ڪيو ويندو ۽ اسان جو پروگرام حادثو ٿيندو جڏهن عمل ڪيو ويندو، ڇاڪاڻ ته CDI ڪنٽينر انھن کي 2 الڳ بئن سمجھندو (جيتوڻيڪ حقيقت ۾ اھي ساڳيا طبقا آھن، جن بابت CDI ڪنٽينر ٻه ڀيرا سکيو). هن کان بچڻ لاء، اتي 2 اختيار آهن:
  • لائن کي هٽايو initializer.addPackages(App.class.getPackage())۽ xml فائل جي متبادل جو اشارو شامل ڪريو:
<beans
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">
    <alternatives>
        <class>ru.javarush.NetworkLogger</class>
    </alternatives>
</beans>
  • beans جي روٽ عنصر ۾ bean-discovery-modeقدر " none " سان هڪ وصف شامل ڪريو ۽ هڪ متبادل پروگرام طور بيان ڪريو:
initializer.addPackages(App.class.getPackage());
initializer.selectAlternatives(NetworkLogger.class);
اهڙيء طرح، CDI متبادل استعمال ڪندي، ڪنٽينر اهو طئي ڪري سگهي ٿو ته ڪهڙي بين کي چونڊيو وڃي. دلچسپ ڳالهه اها آهي ته، جيڪڏهن CDI ڪنٽينر ڄاڻن ٿا ڪيترن ئي متبادلن لاءِ هڪ ئي انٽرفيس، ته پوءِ اسان ان کي ٻڌائي سگھون ٿا اشارو ڪندي ترجيح استعمال ڪندي تشريح @Priority(جيئن ته CDI 1.1).
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

قابليت

الڳ الڳ، اهو قابل ذڪر آهي ته اهڙي شيء تي بحث ڪرڻ جي قابل آهي. قابليت بيان ڪيل بيان جي مٿان بيان ڪيو ويو آهي ۽ بين جي ڳولا کي بهتر بڻائي ٿو. ۽ هاڻي وڌيڪ تفصيل. دلچسپ ڳالهه اها آهي ته، ڪنهن به صورت ۾ ڪنهن به CDI بين ۾ گهٽ ۾ گهٽ هڪ قابليت آهي - @Any. جيڪڏهن اسان بيان نه ٿا ڪريون ته ڪنهن به قابليت کي بيان کان مٿانهون، پر پوء سي ڊي آئي ڪنٽينر پاڻ کي @Anyقابليت ۾ هڪ ٻيو قابليت شامل ڪري ٿو - @Default. جيڪڏهن اسان ڪنهن به شيءِ جي وضاحت ڪريون ٿا (مثال طور، واضح طور تي وضاحت ڪريو @Any)، ته پوءِ @Default qualifier پاڻمرادو شامل نه ڪيو ويندو. پر قابليت جي خوبي اها آهي ته توهان پنهنجو پاڻ کي قابليت ٺاهي سگهو ٿا. qualifier لڳ ڀڳ ڪو به تشريح کان مختلف آهي، ڇاڪاڻ ته جوهر ۾، هي صرف هڪ تشريح آهي خاص طريقي سان لکيل آهي. مثال طور، توھان داخل ڪري سگھو ٿا Enum پروٽوڪول جي قسم لاءِ:
public enum ProtocolType {
    HTTP, HTTPS
}
اڳيون اسان هڪ قابليت ٺاهي سگهون ٿا جيڪو هن قسم کي حساب ۾ رکندو:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Protocol {
    ProtocolType value();
    @Nonbinding String comment() default "";
}
اهو قابل ذڪر آهي ته نشان لڳل فيلڊ @Nonbindingقابليت جي عزم کي متاثر نه ڪن. هاڻي توهان کي قابليت جي وضاحت ڪرڻ جي ضرورت آهي. اهو مٿي بيان ڪيو ويو آهي bean جي قسم (انهي ڪري ته CDI ڄاڻي ٿو ته ان جي وضاحت ڪيئن ڪجي) ۽ انجيڪشن پوائنٽ جي مٿان (@Inject تشريح سان ته جيئن توهان سمجهو ته هن جاءِ تي انجيڪشن لاءِ ڪهڙي بين ڳولڻي آهي). مثال طور، اسان ڪجھ ڪلاس شامل ڪري سگھون ٿا قابليت سان. سادگي لاءِ، هن آرٽيڪل لاءِ اسين انهن کي NetworkLogger ۾ ڪنداسين:
public interface Sender {
	void send(byte[] data);
}

@Protocol(ProtocolType.HTTP)
public static class HTTPSender implements Sender{
	public void send(byte[] data) {
		System.out.println("sended via HTTP");
	}
}

@Protocol(ProtocolType.HTTPS)
public static class HTTPSSender implements Sender{
	public void send(byte[] data) {
		System.out.println("sended via HTTPS");
	}
}
۽ پوءِ جڏهن اسان Inject ڪريون ٿا، اسان هڪ قابليت جي وضاحت ڪنداسين جيڪو اثر انداز ڪندو ته ڪهڙي طبقي کي استعمال ڪيو ويندو:
@Inject
@Protocol(ProtocolType.HTTPS)
private Sender sender;
عظيم، ڇا اهو ناهي؟) اهو خوبصورت لڳي ٿو، پر اهو واضح ناهي ڇو. هاڻي هيٺ ڏنل تصور ڪريو:
Protocol protocol = new Protocol() {
	@Override
	public Class<? extends Annotation> annotationType() {
		return Protocol.class;
	}
	@Override
	public ProtocolType value() {
		String value = "HTTP";
		return ProtocolType.valueOf(value);
	}
};
container.select(NetworkLogger.Sender.class, protocol).get().send(null);
هن طريقي سان اسان حاصل ڪرڻ جي قيمت کي ختم ڪري سگهون ٿا ته جيئن اهو متحرڪ طور تي ڳڻپ ڪري سگهجي. مثال طور، اهو ڪجهه سيٽنگن مان ورتو وڃي ٿو. پوءِ اسان پروگرام/سرور کي ٻيهر گڏ ڪرڻ يا ٻيهر شروع ڪرڻ کان سواءِ اڏام تي به عمل درآمد کي تبديل ڪري سگھون ٿا. اهو گهڻو وڌيڪ دلچسپ ٿي ويندو آهي، ڇا اهو ناهي؟ )
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

پيدا ڪندڙ

سي ڊي آئي جي هڪ ٻي مفيد خصوصيت پيدا ڪندڙ آهي. اهي خاص طريقا آهن (اهي هڪ خاص تشريح سان نشان لڳل آهن) جن کي سڏيو ويندو آهي جڏهن ڪجهه بينن انحصار انجڻ جي درخواست ڪئي آهي. وڌيڪ تفصيل دستاويزن ۾ بيان ڪيا ويا آهن، سيڪشن " 2.2.3. پروڊيوسر طريقن " ۾. سادو مثال:
@Produces
public Integer getRandomNumber() {
	return new Random().nextInt(100);
}
ھاڻي جڏھن Integer قسم جي فيلڊن ۾ داخل ڪيو ويندو، اھو طريقو سڏيو ويندو ۽ ان مان ھڪڙي قيمت حاصل ڪئي ويندي. هتي اسان کي فوري طور تي سمجهڻ گهرجي ته جڏهن اسان لفظ نئون ڏسون ٿا، اسان کي فوري طور تي سمجهڻ گهرجي ته هي هڪ CDI بين ناهي. اهو آهي، بي ترتيب طبقي جو هڪ مثال صرف هڪ CDI بين نه بڻجي ويندو، ڇاڪاڻ ته اهو ڪنهن شيء مان نڪتل آهي جيڪو CDI ڪنٽينر کي ڪنٽرول ڪري ٿو (هن صورت ۾، پيدا ڪندڙ).
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

مداخلت ڪندڙ

مداخلت ڪندڙ مداخلت ڪندڙ آهن جيڪي ڪم ۾ "مداخلت" ڪن ٿا. CDI ۾ اهو بلڪل واضح طور تي ڪيو ويندو آهي. اچو ته ڏسون ته اسان ڪيئن ڪري سگھون ٿا لاگنگ استعمال ڪندي ترجمو ڪندڙ (يا interceptors). پهرين، اسان کي وضاحت ڪرڻ جي ضرورت آهي مداخلت جي پابند کي. ڪيترن ئي شين وانگر، هي تشريح استعمال ڪندي ڪيو ويندو آهي:
@Inherited
@InterceptorBinding
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface ConsoleLog {
}
هتي بنيادي شيء اها آهي ته اهو مداخلت ڪندڙ ( @InterceptorBinding) لاء هڪ پابند آهي، جيڪو ورثي ۾ وڌايو ويندو ( @InterceptorBinding). هاڻي اچو ته انٽرسيپٽر پاڻ لکون:
@Interceptor
@ConsoleLog
public class LogInterceptor {
    @AroundInvoke
    public Object log(InvocationContext ic) throws Exception {
        System.out.println("Invocation method: " + ic.getMethod().getName());
        return ic.proceed();
    }
}
توھان وڌيڪ پڙھي سگھوٿا ته ڪيئن interceptors لکيا ويا آھن مثال ۾ وضاحت کان: " 1.3.6. Interceptor مثال ". خير، اسان کي اهو ڪرڻو آهي ته انسيپٽر کي چالو ڪيو وڃي. هن کي ڪرڻ لاء، بيان ڪريو پابند تشريح مٿي ڏنل طريقي سان عمل ڪيو پيو وڃي:
@ConsoleLog
public void print(String message) {
۽ هاڻي هڪ ٻيو تمام اهم تفصيل. Interceptors ڊفالٽ طور تي معذور آهن ۽ ساڳئي طريقي سان فعال ٿيڻ گهرجي جيئن متبادل. مثال طور، beans.xml فائل ۾ :
<interceptors>
	<class>ru.javarush.LogInterceptor</class>
</interceptors>
جئين توهان ڏسي سگهو ٿا، اهو بلڪل سادو آهي.
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

واقعا ۽ مبصر

CDI پڻ واقعن ۽ مبصرن جو هڪ نمونو مهيا ڪري ٿو. هتي هر شي واضح ناهي جيئن مداخلت ڪندڙن سان. تنهن ڪري، هن معاملي ۾ واقعو بلڪل ڪنهن به طبقي جو ٿي سگهي ٿو؛ وضاحت لاء ڪجهه خاص گهربل ناهي. مثال طور:
public class LogEvent {
    Date date = new Date();
    public String getDate() {
        return date.toString();
    }
}
هاڻي ڪنهن کي واقعي جو انتظار ڪرڻ گهرجي:
public class LogEventListener {
    public void logEvent(@Observes LogEvent event){
        System.out.println("Message Date: " + event.getDate());
    }
}
هتي مکيه شيء آهي وضاحت ڪرڻ @Observes تشريح، جنهن مان ظاهر ٿئي ٿو ته اهو صرف هڪ طريقو ناهي، پر هڪ طريقو آهي جنهن کي سڏيو وڃي ٿو نتيجن کي ڏسڻ جي نتيجي ۾ LogEvent قسم جي. خير، هاڻي اسان کي ڪنهن جي ضرورت آهي جيڪو ڏسندو:
public class LogObserver {
    @Inject
    private Event<LogEvent> event;
    public void observe(LogEvent logEvent) {
        event.fire(logEvent);
    }
}
اسان وٽ ھڪڙو طريقو آھي جيڪو ڪنٽينر کي ٻڌائيندو ته ھڪڙو واقعو واقعو واقع ٿيو آھي واقعي جي قسم LogEvent لاءِ. هاڻي باقي رهي ٿو مبصر استعمال ڪرڻ لاء. مثال طور، NetworkLogger ۾ اسان اسان جي مبصر جو هڪ انجڻ شامل ڪري سگهون ٿا:
@Inject
private LogObserver observer;
۽ پرنٽ طريقي سان اسان مبصر کي مطلع ڪري سگھون ٿا ته اسان وٽ ھڪڙو نئون واقعو آھي:
public void print(String message) {
	observer.observe(new LogEvent());
اهو ڄاڻڻ ضروري آهي ته واقعن تي عمل ڪري سگهجي ٿو هڪ سلسلي ۾ يا ڪيترن ۾. غير مطابقت واري پروسيسنگ لاءِ، هڪ طريقو استعمال ڪريو .fireAsync(. فائر جي بدران) ۽ هڪ تشريح @ObservesAsync(@Observes جي بدران). مثال طور، جيڪڏهن سڀئي واقعا مختلف موضوعن ۾ جاري ڪيا ويا آهن، پوء جيڪڏهن 1 موضوع هڪ استثنا اڇلائي، ته پوء ٻيا ٻين واقعن لاء پنهنجو ڪم ڪرڻ جي قابل هوندا. توهان CDI ۾ واقعن جي باري ۾ وڌيڪ پڙهي سگهو ٿا، هميشه وانگر، تفصيل ۾، باب " 10. واقعن " ۾.
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

سينگار ڪندڙ

جيئن اسان مٿي ڏٺو، سي ڊي آئي ونگ تحت مختلف ڊيزائن جا نمونا گڏ ڪيا ويا آهن. ۽ هتي هڪ ٻيو آهي - هڪ سينگار. هي هڪ تمام دلچسپ شيء آهي. اچو ته هن طبقي تي هڪ نظر رکون:
@Decorator
public abstract class LoggerDecorator implements Logger {
    public final static String ANSI_GREEN = "\u001B[32m";
    public static final String ANSI_RESET = "\u001B[0m";

    @Inject
    @Delegate
    private Logger delegate;

    @Override
    public void print(String message) {
        delegate.print(ANSI_GREEN + message + ANSI_RESET);
    }
}
ان کي سجاڳيءَ جو اعلان ڪندي، اسان چئون ٿا ته جڏهن ڪو به Logger عمل درآمد ڪيو ويندو، اهو ”اضافو“ استعمال ڪيو ويندو، جيڪو حقيقي عمل کي ڄاڻي ٿو، جيڪو نمائندو فيلڊ ۾ محفوظ ٿيل آهي (جيئن ته ان کي تشريح سان نشان لڳايو ويو آهي @Delegate). سجاڳيءَ جو تعلق صرف سي ڊي آءِ بيئن سان ٿي سگهي ٿو، جيڪو پاڻ نه ڪو مداخلت ڪندڙ آهي ۽ نه ئي سينگار ڪندڙ. ھڪڙو مثال پڻ وضاحت ۾ ڏسي سگھجي ٿو: " 1.3.7. سجاڳي جو مثال ". آرائشيٽر، مداخلت ڪندڙ وانگر، لازمي طور تي چالو ڪيو وڃي. مثال طور، beans.xml ۾ :
<decorators>
	<class>ru.javarush.LoggerDecorator</class>
</decorators>
وڌيڪ تفصيل لاءِ ڏسو ويلڊ جو حوالو: " باب 10. سينگار ڪندڙ ".

زندگيءَ جو چڪر

ڀاڄين کي پنهنجي زندگيءَ جو چڪر هوندو آهي. اهو ڪجهه هن طرح نظر اچي ٿو:
انحصار انجيڪشن ۾ هڪ مختصر سفر يا
جئين توهان تصوير مان ڏسي سگهو ٿا، اسان وٽ نام نهاد لائف سائيڪل ڪال بڪ آهن. اهي تشريحون آهن جيڪي سي ڊي آئي ڪنٽينر کي ٻڌائينديون ته ڪجهه طريقن کي سڏڻ لاءِ هڪ خاص اسٽيج تي بينن جي زندگي جي چڪر ۾. مثال طور:
@PostConstruct
public void init() {
	System.out.println("Inited");
}
اهو طريقو سڏيو ويندو جڏهن هڪ سي ڊي آئي بيئن هڪ ڪنٽينر طرفان فوري طور تي آهي. ساڳيو ئي ٿيندو @PreDestroy سان جڏهن لوبن کي تباهه ڪيو وڃي جڏهن ان جي ضرورت نه رهي. اهو ڪجھ به نه آهي ته مخفف CDI ۾ اکر C - Context شامل آهي. سي ڊي آئي ۾ ڀاڄيون لاڳاپيل آهن، مطلب ته انهن جي زندگي جي چڪر ان حوالي سان منحصر آهي جنهن ۾ اهي CDI ڪنٽينر ۾ موجود آهن. ھن کي بھتر سمجھڻ لاءِ، توھان کي پڙھڻ گھرجي تفصيلي سيڪشن ” 7. صحيفي مثالن جي زندگيءَ جو دائرو “. اهو پڻ ڄاڻڻ جي لائق آهي ته ڪنٽينر پاڻ ۾ هڪ زندگي چڪر آهي، جنهن بابت توهان پڙهي سگهو ٿا " ڪنٽينر لائف سائيڪل واقعن " ۾.
انحصار انجيڪشن ۾ هڪ مختصر سفر يا

ڪُل

مٿي اسان برفاني چوٽيءَ جي چوٽيءَ کي ڏٺو جنهن کي CDI سڏيو ويندو آهي. CDI JEE وضاحت جو حصو آهي ۽ JavaEE ماحول ۾ استعمال ٿيندو آهي. جيڪي اسپرنگ استعمال ڪن ٿا سي ڊي آءِ استعمال نٿا ڪن، پر ڊي آءِ، يعني اھي ڪجھ مختلف وضاحتون آھن. پر مٿي ڄاڻايل ۽ سمجهڻ، توهان آساني سان پنهنجو ذهن تبديل ڪري سگهو ٿا. انهي ڳالهه تي غور ڪندي ته بهار سي ڊي آئي دنيا جي تشريح جي حمايت ڪري ٿي (ساڳي انجڻ). اضافي مواد: #وياچسلاو
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION