JavaRush /Java Blog /Random-TK /Baglylyk sanjymyna gysga gezelenç ýa-da "CDI başga näme?"...
Viacheslav
Dereje

Baglylyk sanjymyna gysga gezelenç ýa-da "CDI başga näme?"

Toparda çap edildi
Iň meşhur çarçuwalaryň häzirki binýadyna baglylyk sanjymydyr. CDI spesifikasiýasynyň bu barada näme diýýändigini, haýsy esasy mümkinçiliklerimiziň bardygyny we olary nädip ulanyp biljekdigimize göz aýlamagy maslahat berýärin.
Baglylyk sanjymyna gysga gezelenç ýa-da

Giriş

Bu gysga syny CDI ýaly bir zada bagyşlamak isleýärin. Bu näme? CDI kontekstleri we baglylyk sanjymyny aňladýar. Bu, baglylyk sanjymyny we mazmunyny suratlandyrýan Java EE spesifikasiýasy. Maglumat üçin http://cdi-spec.org web sahypasyna seredip bilersiňiz . CDI spesifikasiýa bolany üçin (nähili işlemelidiginiň beýany, interfeýsler toplumy), şonuň üçin ony ulanmak üçin durmuşa geçirmeli bolarys. Şeýle durmuşa geçirişleriň biri Weld - http://weld.cdi-spec.org/ Garaşlylygy dolandyrmak we taslama döretmek üçin Maven ulanarys - https://maven.apache.org Şeýlelik bilen, Maven gurduk, indi biz abstrakt düşünmezlik üçin iş ýüzünde düşüner. Munuň üçin Maven ulanyp, taslama dörederis. Buýruk setirini açalyň (Windows-da, "Işlet" penjiresini açmak we cmd ýerine ýetirmek üçin Win + R ulanyp bilersiňiz) we Maweniň biziň üçin hemme zady etmegini haýyş edeliň. Munuň üçin Maveniň arhetip: Maven arhetip atly düşünjesi bar .
Baglylyk sanjymyna gysga gezelenç ýa-da
Ondan soň, " San saýlaň ýa-da süzgüç ulanyň " we " org.apache.maven.archetypes saýlaň: maven-arhetip-quickstart wersiýasy " soraglaryna Enter basyň. Ondan soň, GAV diýlip atlandyrylýan taslama kesgitleýjilerini giriziň ( Atlandyryş konwensiýasy gollanmasyna serediň ).
Baglylyk sanjymyna gysga gezelenç ýa-da
Taslama üstünlikli döredilenden soň, “BUILD SUCCESS” ýazgysyny göreris. Indi taslamamyzy halaýan IDE-de açyp bileris.

Taslama CDI goşmak

Girişde CDI-iň gyzykly web sahypasynyň bardygyny gördük - http://www.cdi-spec.org/ . Göçürip almak bölümi bar, onda bize zerur maglumatlary öz içine alýan tablisa bar:
Baglylyk sanjymyna gysga gezelenç ýa-da
Bu ýerde, Maveniň CDI API-ni taslamada ulanýandygymyzy nädip suratlandyrýandygyny görüp bileris. API programma programma interfeýsi, ýagny käbir programmirleme interfeýsi. Bu interfeýsiň aňyrsynda näme we nähili işleýändigi barada aladalanman, interfeýs bilen işleýäris. API, taslamamyzda ulanyp başlajak banka arhiwidir, ýagny taslamamyz bu banka bagly bolup başlaýar. Şonuň üçin taslamamyz üçin CDI API baglylyk. Maven şäherinde POM.xml faýllarynda bir taslama beýan edilýär ( POM - Taslamanyň obýekt modeli ). Baglylyklar, täze ýazgy goşmaly garaşlylyk blokynda düşündirilýär:
<dependency>
	<groupId>javax.enterprise</groupId>
	<artifactId>cdi-api</artifactId>
	<version>2.0</version>
</dependency>
Üns beren bolmagyňyz mümkin, berlen baha bilen çäkleri kesgitlemeýäris. Näme üçin beýle tapawut bar? Bu çäk, kimdir biri bize garaşlylygy üpjün etjekdigini aňladýar. Haçan-da bir programma Java EE serwerinde işlese, serwer programmany ähli zerur JEE tehnologiýalary bilen üpjün eder. Bu synyň ýönekeýligi üçin Java SE gurşawynda işläris, şonuň üçin hiç kim bize bu garaşlylygy üpjün etmez. Baglylyk çäkleri barada has giňişleýin maglumaty şu ýerden okap bilersiňiz: " baglylyk çäkleri ". Bolýar, indi interfeýsler bilen işlemek ukybymyz bar. Emma durmuşa geçirilmegi hem zerur. .Adymyzda bolsa, Weld ulanarys. Her ýerde dürli baglylyklaryň berilmegi gyzykly. Emma resminamalary ýerine ýetireris. Şonuň üçin geliň " 18.4.5. Synp ýoluny düzmek " -ni okaň we aýdylyşy ýaly edeliň:
<dependency>
	<groupId>org.jboss.weld.se</groupId>
	<artifactId>weld-se-core</artifactId>
	<version>3.0.5.Final</version>
</dependency>
Weldiň üçünji setir wersiýalarynyň CDI 2.0 goldawy möhümdir. Şonuň üçin bu wersiýanyň API-sine bil baglap bileris. Indi kod ýazmaga taýyn.
Baglylyk sanjymyna gysga gezelenç ýa-da

CDI konteýner işe girizmek

CDI mehanizmdir. Kimdir biri bu mehanizmi dolandyrmalydyr. Aboveokarda okap geçişimiz ýaly, şeýle dolandyryjy konteýner. Şonuň üçin ony döretmeli, özi SE gurşawynda peýda bolmaz. Esasy usulymyza aşakdakylary goşalyň:
public static void main(String[] args) {
	SeContainerInitializer initializer = SeContainerInitializer.newInstance();
	initializer.addPackages(App.class.getPackage());
	SeContainer container = initializer.initialize();
}
CDI konteýnerini el bilen döretdik, sebäbi ... SE gurşawynda işleýäris. Adaty söweş taslamalarynda kod dürli tehnologiýalary üpjün edýän serwerde işleýär. Şoňa görä, serwer CDI bilen üpjün edýän bolsa, bu serwerde eýýäm CDI konteýneriniň bardygyny we bize hiç zat goşmagyň zerurlygynyň ýokdugyny aňladýar. Thisöne bu gollanmanyň maksatlary üçin SE gurşawyny alarys. Mundan başga-da, konteýner şu ýerde, düşnükli we düşnükli. Näme üçin konteýner gerek? Içindäki gapda noýba (CDI noýba) bar.
Baglylyk sanjymyna gysga gezelenç ýa-da

CDI noýbasy

Diýmek, noýba. CDI binasy näme? Bu käbir düzgünlere eýerýän Java synpy. Bu düzgünler spesifikasiýada, " 2.2. Fasulye haýsy synplar? " Bölüminde beýan edilýär. Programma synpy bilen birmeňzeş bukja CDI noýbasyny goşalyň:
public class Logger {
    public void print(String message) {
        System.out.println(message);
    }
}
Indi bu noýba usulymyzdan atlandyryp bileris main:
Logger logger = container.select(Logger.class).get();
logger.print("Hello, World!");
Görşüňiz ýaly, täze açar söz ulanyp, noýba döretmedik. CDI konteýnerinden soradyk: "CDI konteýner. Maňa Logger synpynyň mysaly gerek, maňa bermegiňizi haýyş edýärin." Bu usul " baglylyk gözlemek ", ýagny garaşlylygy gözlemek diýilýär . Indi täze synp döredeliň:
public class DateSource {
    public String getDate() {
        return new Date().toString();
    }
}
Sene tekstini görkezýän başlangyç synp. Indi habara sene çykyşyny goşalyň:
public class Logger {
    @Inject
    private DateSource dateSource;

    public void print(String message) {
        System.out.println(dateSource.getDate() + " : " + message);
    }
}
Gyzykly @ Inject düşündiriş peýda boldy. Cdi kebşirleme resminamalarynyň " 4.1. Sanjym nokatlary " bölüminde aýdylyşy ýaly , bu düşündirişden peýdalanyp, sanjym nokadyny kesgitleýäris. Rus dilinde muny “durmuşa geçiriş nokatlary” hökmünde okamak mümkin. CDI konteýner tarapyndan noýba dessine garaşlylygy sanjym etmek üçin ulanylýar. Görşüňiz ýaly, SanaSource meýdanyna hiç hili baha bermeýäris. Munuň sebäbi, CDI konteýneriniň içindäki CDI noýbasynyň (diňe özi döreden noýba, ýagny dolandyrýan noýba) “ baglylyk sanjymyny ” ulanmagyna rugsat bermegidir. Bu gözegçiligi öwürmegiň başga bir usuly , garaşlylygy obýektleri aç-açan döretmek däl-de, başga biri tarapyndan dolandyrylýan çemeleşme. Baglylyk sanjymy usul, konstruktor ýa-da meýdan arkaly amala aşyrylyp bilner. Has giňişleýin maglumat üçin CDI spesifikasiýa bölümine serediň " 5.5. Baglylyk sanjymy ". Durmuşa geçirilmeli zady kesgitlemegiň tertibine, gürleşmeli zatlarymyz bolan “typeafe” çözgüdi diýilýär.
Baglylyk sanjymyna gysga gezelenç ýa-da

Adyň çözgüdi ýa-da Typesafe çözgüdi

Adatça, ýerine ýetirilmeli obýektiň görnüşi hökmünde interfeýs ulanylýar we CDI konteýner haýsy durmuşa geçirmegi saýlamalydygyny kesgitleýär. Bu, ara alyp maslahatlaşjak köp sebäplere görä peýdalydyr. Şeýlelik bilen bizde hasaba alyş interfeýsi bar:
public interface Logger {
    void print(String message);
}
Käbir ýazgyçymyz bar bolsa, oňa habar iberip bileris we ol öz wezipesini ýerine ýetirer diýýär. Bu ýagdaýda nädip we nirede gyzyklanma bolmaz. Geliň indi ýazyjy üçin durmuşa geçiriş döredeliň:
public class SystemOutLogger implements Logger {
    @Inject
    private DateSource dateSource;

    public void print(String message) {
        System.out.println(message);
    }
}
Görşüňiz ýaly, bu System.out-a ýazýan ýazgydyr. Ajaýyp. Indi esasy usulymyz öňküsi ýaly işlär. Logger logger = container.select(Logger.class).get(); Bu setir henizem ýazyjy tarapyndan kabul ediler. Gözelligi, diňe interfeýsi bilmeli we CDI konteýner biziň üçin durmuşa geçirilmegi hakda eýýäm pikir edýär. Ikinji ýerine ýetirişimiz bar diýeliň, gündeligi bir ýere uzakdaky ammarlara ibermeli:
public class NetworkLogger implements Logger {
    @Override
    public void print(String message) {
        System.out.println("Send log message to remote log system");
    }
}
Indi kodumyzy üýtgetmän işlesek, ýalňyşlyk alarys, sebäbi CDI konteýner interfeýsiň iki ýerine ýetirilişini görýär we olaryň arasyndan saýlap bilmeýär: org.jboss.weld.exceptions.AmbiguousResolutionException: WELD-001335: Ambiguous dependencies for type Logger Näme etmeli? Birnäçe üýtgeşiklik bar. Iň ýönekeý biri, CDI konteýneriniň bu synpy CDI noýbasy hökmünde kabul etmezligi üçin CDI noýbasy üçin @Wetoed düşündirişidir. Emma has gyzykly çemeleşme bar. CDI noýbasy , Weld CDI resminamalarynyň @Alternative" 4.7. Alternatiwler " bölüminde beýan edilen düşündirişleri ulanyp "alternatiw" hökmünde bellik edilip bilner . Bu näme many berýär? Diýmek, ulanarys diýip aç-açan aýtsak, saýlanmaz. Bu noýbanyň alternatiw görnüşi. NetworkLogger noýbasyny @Alternative diýip belläliň we koduň gaýtadan ýerine ýetirilendigini we SystemOutLogger tarapyndan ulanylýandygyny görüp bileris. Alternatiwany işletmek üçin beans.xml faýly bolmaly . Sorag ýüze çykyp biler: " beans.xml, seni nirede goýaýyn? " Şonuň üçin faýly dogry ýerleşdireliň:
Baglylyk sanjymyna gysga gezelenç ýa-da
Bu faýlymyz bolansoň, kodumyz bilen döredilen artefakt “ Açyk noýba arhiwi ” diýlip atlandyrylar. Indi 2 aýratyn konfigurasiýa bar: programma üpjünçiligi we xml. Mesele şol bir maglumatlary ýüklär. Mysal üçin, DataSource noýba kesgitlemesi 2 gezek ýüklener we ýerine ýetirilende programmamyz ýykylar, sebäbi CDI konteýner olary 2 aýry noýba diýip pikir eder (aslynda olar CDI konteýneriniň iki gezek öwrenen bir synpy bolsa-da). Munuň öňüni almak üçin 2 wariant bar:
  • setiri aýyryň initializer.addPackages(App.class.getPackage())we xml faýlyna alternatiwany görkeziň:
<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>
  • noýba kök elementine " nonebean-discovery-mode " bahasy bolan bir atribut goşuň we programma taýdan alternatiw görkeziň:
initializer.addPackages(App.class.getPackage());
initializer.selectAlternatives(NetworkLogger.class);
Şeýlelik bilen, CDI alternatiwasyny ulanyp, konteýner haýsy noýba saýlamalydygyny kesgitläp biler. Gyzykly ýeri, eger CDI konteýner şol bir interfeýs üçin birnäçe alternatiwany bilýän bolsa, onda düşündiriş ulanyp ileri tutulýandygyny görkezip bileris @Priority(CDI 1.1-den bäri).
Baglylyk sanjymyna gysga gezelenç ýa-da

Kärler

Aýry-aýrylykda, saýlama ýaly bir zady ara alyp maslahatlaşmak gerek. Hünär, noýbanyň ýokarsyndaky düşündiriş bilen görkezilýär we noýba gözlegini arassalaýar. Indi has giňişleýin maglumat. Gyzykly tarapy, islendik CDI noýbasynyň iň bolmanda bir kär derejesi bar - @Any. Eger noýbanyň üstünden HER HÖKMANY kesgitlemesek, ýöne CDI konteýneriniň özi @Anysaýlama başga bir kär goşýar - @Default. Haýsydyr bir zady görkezsek (mysal üçin, @Any aç-açan kesgitläň), onda @Default saýlaýjy awtomatiki usulda goşulmaz. Quöne saýlamalaryň gözelligi, öz saýlamalaryňyzy edip bilersiňiz. Saýlama, belliklerden tapawudy ýok diýen ýaly, sebäbi aslynda bu diňe ýörite ýazylan düşündiriş. Mysal üçin, protokol görnüşi üçin Enum-a girip bilersiňiz:
public enum ProtocolType {
    HTTP, HTTPS
}
Ondan soň bu görnüşi göz öňünde tutjak kwalifikasiýa edip bileris:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Protocol {
    ProtocolType value();
    @Nonbinding String comment() default "";
}
@NonbindingBellenen meýdanlaryň saýlama kesgitlemesine täsir etmeýändigini bellemelidiris . Indi kär derejesini görkezmeli. Noýba görnüşiniň ýokarsynda (CDI nädip kesgitlemelidigini bilmegi üçin) we sanjym nokadynyň üstünde görkezilýär (bu ýerde sanjym gözleýändigine düşünmek üçin @Inject belligi bilen). Mysal üçin, kwalifikasiýa bilen käbir synp goşup bileris. Ityönekeýlik üçin, bu makala üçin olary NetworkLogger-iň içinde ederis:
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");
	}
}
Soň bolsa, Injek ýerine ýetirenimizde, haýsy synpyň ulanyljakdygyna täsir etjek bir kär kesgitläris:
@Inject
@Protocol(ProtocolType.HTTPS)
private Sender sender;
Ajaýyp, şeýlemi?) Owadan görünýär, ýöne munuň sebäbini belli däl. Indi aşakdakylary göz öňüne getiriň:
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);
Şeýlelik bilen, dinamiki hasaplap bolar ýaly bahany ýok edip bileris. Mysal üçin, käbir sazlamalardan alyp bolýar. Soňra programmany / serweri täzeden ýazmazdan ýa-da täzeden açmazdan, ýerine ýetirişini üýtgedip bileris. Has gyzykly bolýar, şeýlemi? )
Baglylyk sanjymyna gysga gezelenç ýa-da

Öndürijiler

CDI-iň başga bir peýdaly aýratynlygy öndürijilerdir. Bular käbir noýba garaşlylyk sanjymyny soranda çagyrylýan ýörite usullardyr (ýörite bellik bilen bellenilýär). Has jikme-jiklik resminamalarda, " 2.2.3. Öndüriji usullary " bölüminde beýan edilýär. Iň ýönekeý mysal:
@Produces
public Integer getRandomNumber() {
	return new Random().nextInt(100);
}
Indi, “Integer” görnüşli meýdanlara sanjym edilende, bu usul atlandyrylar we ondan baha alynar. Bu ýerde täze açar söz görenimizde, munuň CDI noýbasy däldigine derrew düşünmelidiris. .Agny, tötänleýin synpyň mysaly diňe CDI konteýnerine gözegçilik edýän bir zatdan (bu ýagdaýda öndüriji) CDI noýbasyna öwrülmez.
Baglylyk sanjymyna gysga gezelenç ýa-da

Kesgitleýjiler

Kesgitleýjiler işe “päsgel berýän” interfeýslerdir. CDI-de bu gaty aýdyň ýerine ýetirilýär. Terjimeçileri (ýa-da interfeýsleri) ulanyp, hasaba alnyşy nädip edip biljekdigimizi göreliň. Ilki bilen, saklaýjynyň baglanyşygyny suratlandyrmalydyrys. Köp zat ýaly, bu düşündirişler arkaly edilýär:
@Inherited
@InterceptorBinding
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface ConsoleLog {
}
Bu ýerde esasy zat, @InterceptorBindinguzaldyjy () bilen miras galan interfeýsor () üçin hökmany zat @InterceptorBinding. Indi saklaýjynyň özi ýazalyň:
@Interceptor
@ConsoleLog
public class LogInterceptor {
    @AroundInvoke
    public Object log(InvocationContext ic) throws Exception {
        System.out.println("Invocation method: " + ic.getMethod().getName());
        return ic.proceed();
    }
}
Kesgitleýjileriň mysalda spesifikasiýadan nädip ýazylandygy barada has giňişleýin okap bilersiňiz: " 1.3.6. Interceptor mysaly ". Dogrusy, diňe etmeli zadymyz, kabul edijini açmak. Munuň üçin ýerine ýetirilýän usulyň üstündäki hökmany düşündirişi görkeziň:
@ConsoleLog
public void print(String message) {
Indi başga bir möhüm jikme-jiklik. Kesgitleýjiler deslapky ýagdaýda ýapylýar we alternatiwalar ýaly işlemeli. Mysal üçin, beans.xml faýlynda :
<interceptors>
	<class>ru.javarush.LogInterceptor</class>
</interceptors>
Görşüňiz ýaly, bu gaty ýönekeý.
Baglylyk sanjymyna gysga gezelenç ýa-da

Waka we synçylar

CDI wakalaryň we synçylaryň modelini hem hödürleýär. Bu ýerde hemme zat saklaýjylar ýaly düşnükli däl. Şeýlelik bilen, bu ýagdaýda bolan waka düýbünden islendik synp bolup biler, düşündiriş üçin aýratyn zat gerek däl. Mysal üçin:
public class LogEvent {
    Date date = new Date();
    public String getDate() {
        return date.toString();
    }
}
Indi kimdir biri çärä garaşmaly:
public class LogEventListener {
    public void logEvent(@Observes LogEvent event){
        System.out.println("Message Date: " + event.getDate());
    }
}
Bu ýerde esasy zat, bu diňe bir usul däl-de, LogEvent görnüşindäki wakalara syn etmegiň netijesinde çagyrylmaly usuldygyny görkezýän @Observes düşündirişini görkezmekdir. Bolýar, indi bize tomaşa etjek biri gerek:
public class LogObserver {
    @Inject
    private Event<LogEvent> event;
    public void observe(LogEvent logEvent) {
        event.fire(logEvent);
    }
}
Konteýnerde LogEvent hadysasynyň görnüşi üçin bir hadysanyň bolandygyny aýdýan ýekeje usulymyz bar. Indi galan zat synçyny ulanmak. Mysal üçin, NetworkLogger-de synçymyza sanjym goşup bileris:
@Inject
private LogObserver observer;
Çap etmek usulynda täze bir wakanyň bardygyny synçylara habar berip bileris:
public void print(String message) {
	observer.observe(new LogEvent());
Wakalaryň bir sapakda ýa-da birnäçe görnüşde gaýtadan işlenip bilinjekdigini bilmek möhümdir. .fireAsyncAsynkron gaýtadan işlemek üçin bir usul (.fire derek) we düşündiriş @ObservesAsync(@Observes ýerine) ulanyň . Mysal üçin, ähli hadysalar dürli sapaklarda ýerine ýetirilen bolsa, 1 sapak kadadan çykma bolsa, beýlekiler beýleki wakalar üçin öz işlerini edip bilerler. CDI-de bolup geçen wakalar barada has giňişleýin, spesifikasiýada, " 10. Wakalar " bölüminde okap bilersiňiz.
Baglylyk sanjymyna gysga gezelenç ýa-da

Bezegçiler

Aboveokarda görşümiz ýaly CDI ganatynyň aşagynda dürli dizaýn nagyşlary ýygnalýar. Ine, başga biri - bezegçi. Bu gaty gyzykly zat. Geliň, bu klasa göz aýlalyň:
@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);
    }
}
Ony bezegçi diýip yglan etmek bilen, Logger haýsydyr bir ýerine ýetiriş ulanylanda, delegasiýa meýdançasynda saklanylýan (bellik bilen bellenilenligi sebäpli) hakyky ýerine ýetirilişini bilýän bu “goşmaçanyň” ulanyljakdygyny aýdýarys @Delegate. Bezegçiler diňe CDI noýbasy bilen baglanyşyp bilerler, özi-de ne interfeýs, ne-de bezegçi. Mysal üçin spesifikasiýada hem görmek bolýar: " 1.3.7. Bezeg mysaly ". Bezegçi, saklaýjy ýaly, açyk bolmaly. Mysal üçin, beans.xml -de :
<decorators>
	<class>ru.javarush.LoggerDecorator</class>
</decorators>
Has giňişleýin maglumat üçin kebşirleme salgylanmasyna serediň: " 10-njy bap. Bezegçiler ".

Durmuş sikli

Fasuliniň öz durmuş aýlawy bar. Bu bir zat ýaly:
Baglylyk sanjymyna gysga gezelenç ýa-da
Suratdan görnüşi ýaly, ömrümiziň yzyna gaýdyp gelmegi diýilýär. Bular CDI konteýnerine noýbanyň ömrüniň belli bir döwründe belli usullary çagyrmagy aýdýan düşündirişlerdir. Mysal üçin:
@PostConstruct
public void init() {
	System.out.println("Inited");
}
Bu usul CDI noýbasy konteýner bilen dessine çagyrylanda atlandyrylar. @PreDestroy bilen noýba indi zerur däl wagty ýok edilende şeýle bolar. CDI-iň gysgaldylan görnüşinde C harpy bar. CDI-däki noýba kontekstlidir, ýagny olaryň ýaşaýyş sikli CDI konteýneriniň içindäki kontekste baglydyr. Muňa has gowy düşünmek üçin “ 7. Kontekstdäki ýagdaýlaryň ömri ” spesifikasiýa bölümini okamaly . Konteýneriň özünde ömür sikliniň bardygyny hem bilmelidiris, ony “ Konteýner ömri sikli wakalarynda ” okap bilersiňiz.
Baglylyk sanjymyna gysga gezelenç ýa-da

Jemi

Oveokarda CDI diýilýän buz buzunyň ujuna göz aýladyk. CDI JEE spesifikasiýasynyň bir bölegi bolup, JavaEE gurşawynda ulanylýar. Bahary ulanýanlar CDI ulanmaýarlar, ýöne DI, ýagny birneme üýtgeşik aýratynlyklar. Aboveöne ýokardakylary bilmek we düşünmek, pikiriňizi aňsatlyk bilen üýtgedip bilersiňiz. Baharyň CDI dünýäsinden düşündirişleri goldaýandygyny göz öňünde tutsak (şol bir sanjym). Goşmaça materiallar: # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION