Selamlar bu yazımda Application Context interface’ini inceleyeceğiz. İlk başta anlatacağım kısım biraz sıkıcı gelebilir ama temellere hakim olmak konuyu daha iyi anlamamıza ve anlam vermemize olumlu katkı sağlayacaktır.
Application Context Interface Nedir?
Spring Framework’ün temel özelliklerinden birisi de IoC Container‘dır. IoC Container, Spring uygulamamızın Bean yönetimini sağlamak ile sorumludur. IoC’yi gerçeklemek için Dependency Injection (@Autowired) kullanır.
BeanFactory ve Application Context interface’leri, Spring IoC Container’ı temsil eder. BeanFactory, Spring IoC container’ına erişim için sağlanan base interface’i barındırır ve Bean’leri yönetmek için temel işlevleri sağlar. ApplicationContext ise BeanFactory’nin bir alt interface’idir. Dolayısıyla, BeanFactory’nin tüm işlevlerini bizlere sunar. Spring Bean nedir? sorusu için linkteki yazımıza göz atabilirsiniz.
Az önce okuduğunuz gibi, ApplicationContext’in ana görevi Bean’lerin yönetimini sağlamaktır. Bu nedenle, bir Spring uygulamasının Bean yapılandırmasını sağlayan şey nedir sorusuna olan yanıtı artık biliyoruz: ApplicationContext.
Spring ile Bean Konfigürasyonu
Spring Framework ile Bean ouşturmak için kullanacağımız sınıfı bir streotype ile belirtmemiz gerekir. Bu yazımda ben @Configuration ile belirteceğim.
@Configuration annotation’ını kullanrak örnek bir Bean oluşturalım:
@Configuration public class MySpringSecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
XML ile Bean Konfigürasyonu
Bean konfigürasyonlarımızı içeren bir xml dosyası yardımıyla da şu şekilde bir Bean oluşumu sağlayabiliriz:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="com.codingbytime.xmlTest.xml"> <property name="myXml" value="some-value"></property> </bean> </beans>
Bu xml’e erişmek için ise class’ımız içerisinde aşağıda görebileceğiniz gibi xml dosyamızda tanımlı Bean’lere ApplicationContext üzerinden bu şekilde erişebiliyoruz.
ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");
ApplicationContext’in Diğer Özellikleri
Internationalization
ApplicationContext interface’i, MessageSource interface’ini extend eder ve bu sayede internationalization (i18n) desteği de sağlar.
Standart-Custom Event Handling
ApplicationContext, ApplicationEvent sınıfı ve ApplicationListener interface’i yardımıyla event handling’i destekler. ContextStartedEvent, ContextStoppedEvent, ContextClosedEvent ve RequestHandledEvent gibi built-in method’ları sağlar. Dahası, iş kullanım durumları için özel event’leri de destekler.
Ayrıca custom event’ler de implemet edilebilir. ApplicationContext üzerinde, ApplicationEvent uygulayan özel olay sınıfınızın bir örneği olan bir parametre belirterek, publishEvent() metodunu çağırmanız yeterlidir. Event Listener’lar, olayları senkron olarak alır. Bu, tüm Listener’lar event işlemeyi bitirene kadar publishEvent() metodunu blokladığı anlamına gelir.
Low-Level Resource’lara Kolay Erişim
Application context, resouce’ları yüklemek için kullanılabilen bir ResourceLoader’dır. Bir resouce, esasen JDK sınıfı java.net.URL’nin daha zengin özelliklere sahip bir sürümüdür, aslında, resoruce uygulamaları, uygun olduğunda java.net.URL’nin bir örneklemini kapsar. Bir resouce, classpath, bir dosya yolu ya da standart bir URL ile tanımlanabilen herhangi bir yere ve diğer bazı varyasyonlar dahil olmak üzere hemen hemen her konumdan şeffaf bir şekilde düşük düzeyli kaynaklara erişimi sağlayabilir.
AOP (Aspect-Oriented Programming) Desteği
Aspect-Oriented Programming (AOP), uygulama kodunu temel işlevselliğini bozmadan farklı alanlardaki (örneğin günlükleme, yetkilendirme, hata yönetimi) endişeleri işlemek için kullanılan bir programlama paradigmasıdır. Spring, AOP’yi destekler ve bu, uygulamanızdaki belirli ilgi alanlarına (concerns) yönelik kodları ayırmanızı sağlar. İşte bir örnek:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBeforeServiceMethods() { System.out.println("Before executing a service method"); } }
Yukarıdaki örnek, Spring AOP ile bir günlükleme (logging) aspect’i oluşturur. @Aspect
işareti, bu sınıfın bir aspect olduğunu belirtir. @Before
işareti, belirtilen hedef yöntemlerin çalışmadan önce belirtilen kodun çalıştırılacağını gösterir. Örneğin, “com.example.service” paketindeki tüm yöntemlerin çağrılmadan önce “Before executing a service method” mesajı yazdırılacaktır.
Veritabanı Erişimi ve İşlem Yönetimi
Spring, veritabanı erişimi ve işlem yönetimi için bir dizi araç ve modül sunar. İşte bir örnek, veritabanı işlemi için Spring JDBC kullanımına dair bir kod parçası:
import org.springframework.jdbc.core.JdbcTemplate; public class EmployeeDAO { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public int saveEmployee(Employee employee) { String query = "INSERT INTO employees (id, name, department) VALUES (?, ?, ?)"; return jdbcTemplate.update(query, employee.getId(), employee.getName(), employee.getDepartment()); } }
Yukarıdaki örnekte, JdbcTemplate
kullanılarak veritabanına yeni bir çalışan eklemek için bir saveEmployee
yöntemi bulunur. JdbcTemplate
otomatik olarak bağlantı yönetimi, SQL ifadesi yürütme ve sonuç işleme gibi işleri ele alır. Veritabanı bağlantısı ve yapılandırma, Spring tarafından yönetilir.
Ayrıca, Spring Transaction Management ile işlem yönetimi de sağlanabilir. İşte bir örnek:
import org.springframework.transaction.annotation.Transactional; @Service public class EmployeeService { @Autowired private EmployeeDAO employeeDAO; @Transactional public void saveEmployee(Employee employee) { employeeDAO.saveEmployee(employee); } }
@Transactional
işareti, bu hizmet yönteminin bir işlem içinde çalıştırılacağını belirtir. Bu sayede işlem başarılı bir şekilde tamamlanırsa, değişiklikler otomatik olarak veritabanına uygulanır veya geri alınır.
Bu örnekler, Spring’in AOP ve veritabanı erişimi ile işlem yönetimi yeteneklerini göstermektedir. Spring, daha karmaşık senaryolar için de geniş bir destek sunar ve detaylı bilgiye Spring belgelerinden ulaşabilirsiniz.