Sobes.tech
Middle

Vai ir iespējams ievadīt atkarības ne tikai caur konstruktoru?

sobes.tech AI

Atbilde no AI

Jā, tas ir iespējams. Papildus atkarību injekcijai caur konstruktoru (Constructor-based dependency injection), Spring Framework ir šādi galvenie veidi:

  1. Injekcija caur setter (Setter-based dependency injection): atkarības tiek ieviestas caur publiskiem setter metodēm.

    public class MyClass {
        private Dependency dependency;
    
        public void setDependency(Dependency dependency) {
            this.dependency = dependency;
        }
    
        // ... citi metodi
    }
    
  2. Injekcija caur lauku (Field-based dependency injection): atkarības tiek tieši ieviestas klases laukos, izmantojot anotācijas (piemēram, @Autowired). Šis veids ir visizplatītākais, bet tam ir savi trūkumi (piemēram, sarežģītība moduļu testēšanā un slēptā atkarība).

    public class MyClass {
        @Autowired
        private Dependency dependency;
    
        // ... citi metodi
    }
    
  3. Injekcija caur metodēm (Method-based dependency injection): mazāk izplatīts veids, kad atkarības tiek ieviestas caur jebkuru metodi, kas ir atzīmēta ar atbilstošu anotāciju (@Autowired).

    public class MyClass {
        private Dependency dependency;
    
        @Autowired
        public void configure(Dependency dependency) {
            this.dependency = dependency;
        }
    
        // ... citi metodi
    }
    

Izvēle ir atkarīga no konkrētās situācijas un priekšroku. Konstruktoru injekcija parasti tiek uzskatīta par priekšrocību, jo garantē, ka objekts tiks izveidots ar visām nepieciešamajām atkarībām un atvieglo testēšanu. Tomēr, injekcija caur laukiem vai setteriem var būt ērtāka izvēle opcijām atkarībām vai darbam ar legacy kodu.