Spring Beans ve Dependency Injection

Buse Keklik
3 min readMay 16, 2024

Spring Beans ve Bağımlılık Enjeksiyonu Anlamak

Spring Beans, her Spring uygulamasının bel kemiğidir. Peki, bunlar tam olarak nedir? Gelin buna bir bakalım.

Bean Nedir?

Spring dünyasında bir bean, Spring konteynerinin (‘ApplicationContext` olarak bilinir) sizin için oluşturduğu, sakladığı ve yönettiği bir nesnedir. Bir sınıfı “@Component” ile işaretlediğinizde, Spring bu sınıfı otomatik olarak keşfeder ve bir bean olarak örneğini oluşturur. Bu, nesneleri manuel olarak oluşturmanız gerekmediği anlamına gelir.

Örneğin, basit bir örneğe bakalım:

@Configuration
public class AppConfig {
@Bean
public SomeObject method() {
return new SomeObject();
}
}

Bu kod parçasında, `AppConfig` sınıfı `@Configuration` ile işaretlenmiştir, bu da onun bean tanımları için bir kaynak olduğunu belirtir. `method()` metodundaki `@Bean` açıklaması, Spring’e `SomeObject` örneğini bir bean olarak yönetmesini söyler.

Daha karmaşık bir şekilde bakalım.

@Configuration
public class MyAppConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}

@Bean
public UserService userService() {
return new UserService(jdbcTemplate(dataSource()));
}
}

Bu örnekte:

  • dataSource() metodu, bir DataSource nesnesi oluşturur ve yapılandırır.
  • jdbcTemplate() metodu, JdbcTemplate nesnesini oluşturur ve veri kaynağını kullanır.
  • userService() metodu, UserService sınıfının bir örneğini oluşturur ve JdbcTemplate nesnesini enjekte eder.

Farklı Bileşen Türleri

‘@Controller’, `@Service` ve `@Repository` gibi birkaç annotation görebilirsiniz. Bunlar, `@Component`’in özel biçimleridir. Hepsi aynı amaca hizmet eder: Spring’in bu sınıfları yönetebileceği bean’lere dönüştürmek. İşte kısa bir özet:

- `@Controller`: Spring MVC’de kontrolör sınıflarını tanımlar.
- `@Service`: Bir sınıfın iş mantığı içerdiğini belirtir.
- `@Repository`: Bir sınıfı veri deposu olarak işaretler.

Bu açıklamalar belirli anlamsal anlamlara sahip olsa da, hepsi Spring’e sınıfı bir bean olarak ele almasını söyler.

Dependency Injection(Bağımlılık Enjeksiyonu)

Şimdi, Spring’de temel bir kavram olan bağımlılık enjeksiyonundan (DI) bahsedelim. DI, bir sınıf içinde bağımlılıkları manuel olarak oluşturmak yerine, Spring’in bunları sizin için enjekte etmesi anlamına gelir.

Bu neden önemlidir? Çünkü sıkı bağlama (bir bağımlılığı onun bağımlı sınıfı içinde oluşturmak) kodunuzu test etmeyi ve sürdürmeyi zorlaştırabilir. DI, bağımlılıkları harici olarak yöneterek bunu önlemeye yardımcı olur.

Bir Spring Uygulamasında Beans ve Bağımlılık Enjeksiyonu Nasıl Çalışır?

Spring uygulamalarında beans ve bağımlılık enjeksiyonu (DI), projelerinizde düzeni ve test edilebilirliği artıran önemli mekanizmalardır. İşte bu sürecin nasıl çalıştığını adım adım ve biraz daha detaylı açıklayalım.

1. Sınıflarınızı Anotate Edin

Öncelikle, sınıflarınızı `@Component`, `@Service` veya `@Repository` gibi açıklamalarla işaretlersiniz. Bu açıklamalar, Spring’in bu sınıfları tarayıp yönetmesi gerektiğini bildirir. Örneğin:

@Service
public class UserService {
}
@Repository
public class UserRepository {
}

2. Bileşen Tarama (Component Scanning)

Spring Boot, projenizdeki bileşen açıklamalarını otomatik olarak tarar. Bu, uygulamanızın başlangıcında gerçekleşir ve Spring, açıklamalı sınıfları bulur. Spring Boot, genellikle `@SpringBootApplication` ile işaretlenmiş ana sınıfın bulunduğu paketten itibaren tarama yapar.

@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

3. Bean Oluşturma

Spring, tarama sırasında bulduğu açıklamalı sınıfları bean’lere dönüştürür. Bu sınıfların örneklerini oluşturur ve bunları `ApplicationContext` içinde yönetir. Bu sayede, nesne yönetimini Spring üstlenir ve manuel olarak nesne oluşturma gereksiniminiz ortadan kalkar.

4.@Autowired ile Enjeksiyon

Spring, oluşturduğu bean’leri ihtiyaç duyulan yerlere enjekte eder. Bu enjeksiyon işlemi, `@Autowired` açıklaması kullanılarak gerçekleştirilir. `@Autowired` açıklaması, bağımlılıkların otomatik olarak enjekte edilmesini sağlar.

Örneğin, `UserService` sınıfını `UserController` sınıfına enjekte edelim:

@Controller
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}

// Other methods
}

Bu örnekte, `UserController` sınıfı `UserService`’e bağımlıdır. `@Autowired` açıklaması, Spring’in `UserService` bean’ini `UserController`’a enjekte etmesini sağlar.

@Service
public class GradeService {
// ...
}
@Repository
public class GradeRepository {
// ...
}
@Controller
public class GradeController {
private final GradeService gradeService;
@Autowired
public GradeController(GradeService gradeService) {
this.gradeService = gradeService;

Bu kurulumda, `GradeService` ve `GradeRepository` bean’dir. `GradeController` sınıfının `GradeService`’e bir bağımlılığı vardır ve bu, Spring tarafından `@Autowired` açıklaması aracılığıyla enjekte edilir.

Sonuç

Sonuç olarak Spring, beans ve bağımlılık enjeksiyonu kodunuzun daha temiz, düzenli ve test edilebilir olmasını sağlar. Spring’in bu gücünü kullanarak, karmaşık bağımlılıkları bile kolayca yönetebilir ve sürdürülebilir bir uygulama geliştirebilirsiniz.

Bu yazıyı okuduğunuz için teşekkür ederim! Umarım Spring Beans ve Bağımlılık Enjeksiyonu konusunu daha iyi anlamanıza yardımcı olabilmişimdir. Sorularınız veya yorumlarınız varsa, lütfen iletişim kurmaktan çekinmeyin. Happy coding!✨

--

--