Senior
Kā darbojas Spring Framework 'zem motora pārsega'?
sobes.tech AI
Atbilde no AI
Spring Framework darbo principus ir mechanizmus apibūdina keli pagrindiniai principai:
-
Valdymo inversija (Inversion of Control - IoC):
- Spring konteineris (
ApplicationContext) valdo objektų (bean'ų) gyvavimo ciklą. - Vietoj to, kad objektai patys kurti savo priklausomybes, jie jas deklaruoja, o konteineris jas įdiegia (Dependency Injection - DI).
- Tai pasiekiama naudojant:
- Konfigūraciją: XML, anotacijas (
@Autowired,@Inject), JavaConfig (@Configuration,@Bean). - Refleksiją: Spring skenuoja klases, anotacijas ir metainformaciją, kad nustatytų bean'us ir jų priklausomybes.
- Konfigūraciją: XML, anotacijas (
- Spring konteineris (
-
Aspektų orientuotas programavimas (Aspect-Oriented Programming - AOP):
- Leidžia moduliuoti bendrus aspektus (tokius kaip logavimas, saugumas, transakcijų valdymas).
- Šie aspektai įgyvendinami kaip aspektai, kurie gali būti taikomi įvairiose jungties taškuose programos vykdymo metu.
- Spring AOP naudoja proxy (JDK Dynamic Proxies arba CGLIB), kad perimtų metodų iškvietimus ir taikytų aspektus.
- Taikoma vykdymo metu (runtime weaving).
-
Abstrakcija:
- Spring teikia aukšto lygio abstrakcijas virš žemyninių API, supaprastindamas kūrimą. Pavyzdžiai:
- Transakcijų valdymas (
PlatformTransactionManager) abstrahuoja skirtingas realizacijas (JTA, JDBC, JPA). - Duomenų prieiga (JDBC, JPA/Hibernate) siūlo supaprastintus šablonus (
JdbcTemplate,JpaTemplate) ir klaidų apdorojimą. - MVC karkasas abstrahuoja HTTP užklausų apdorojimą.
- Transakcijų valdymas (
- Spring teikia aukšto lygio abstrakcijas virš žemyninių API, supaprastindamas kūrimą. Pavyzdžiai:
-
Spring konteineris (
ApplicationContext):- Pagrindinė komponentė, valdanti bean'us.
- Skaito klases, meta informaciją (konfigūraciją), kuria, konfigūruoja ir valdo bean'ų gyvavimo ciklą.
- Registruoja bean apibrėžimus ir kuria bean'ų egzempliorius pagal poreikį arba paleidimo metu (priklausomai nuo matomumo srities ir vėlyvos inicializacijos).
- Atlieka Dependency Injection.
- Teikia paslaugas, tokias kaip lokalizacija, įvykių publikavimas, išteklių įkėlimas.
-
Refleksija:
- Plačiai naudojama:
- classpath skanavimui dėl klasių su anotacijomis (
@Component,@Service,@Repository,@Controller). - Anotacijų metainformacijos skaitymui (
@Autowired,@Value,@Transactional). - Konstruktorių ir metodų gavimui, kad būtų galima kurti bean'us ir įdiegti priklausomybes.
- Dinamiškai kurti proxy objektus AOP.
- classpath skanavimui dėl klasių su anotacijomis (
- Plačiai naudojama:
-
Bean'o gyvavimo ciklas:
- Spring konteineris valdo bean'o gyvavimo ciklą, kuris apima:
- Objekto kūrimą.
- Priklausomybių įdiegimą.
BeanNameAware,BeanFactoryAware,ApplicationContextAwarevykdymą.BeanPostProcessorvykdymą (postProcessBeforeInitialization).@PostConstructarbaafterPropertiesSetvykdymą.- Inicijalizacijos metodo vykdymą, nurodytą
@Beanarba XML. - Bean naudojimą.
BeanPostProcessorvykdymą (postProcessAfterInitialization).@PreDestroyarbadestroyableBeanvykdymą.- Naikinimo metodo vykdymą, nurodytą
@Beanarba XML.
- Spring konteineris valdo bean'o gyvavimo ciklą, kuris apima:
// Pavyzdys naudojant @Autowired priklausomybei įdiegti
@Component // Bean valdomas Spring
public class OrderService {
private final ProductRepository productRepository; // Priklausomybė
@Autowired // Spring įdės čia ProductRepository egzempliorių
public OrderService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
// ... paslaugos metodai
}
// Pavyzdys naudojant @Aspect AOP
@Aspect // Šis klasė yra aspektas
@Component
public class LoggingAspect {
// Taškas jungtis: bet kuris metodas bet kurioje klasėje package com.example.service
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}
// Patarimas: prieš vykdant metodą taške serviceLayer
@Before("serviceLayer()")
public void logMethodCall(JoinPoint joinPoint) {
System.out.println("Calling method: " + joinPoint.getSignature().getName());
}
}
Spring veikia kaip karkasas, kuris valdo programos struktūrą ir vykdymą, naudodamas IoC, DI ir AOP, siekiant užtikrinti modulį, testavimą ir kodo priežiūrą. Jis abstrahuoja daugelį sudėtingų Java EE ir kitų technologijų aspektų.