Senior
Kuidas töötab Spring Framework 'kapoti all'?
sobes.tech AI
Vastus AI-lt
Spring Framework töötab, kasutades mitmeid põhialuseid ja mehhanisme:
-
Juhtimise pööramine (Inversion of Control - IoC):
- Spring konteiner (tavaliselt
ApplicationContext) haldab objektide (bean'ide) elutsüklit. - Selle asemel, et objektid ise loovad oma sõltuvused, nad deklarivad need ja konteiner sisestab need (Dependency Injection - DI).
- Seda saavutatakse järgmiste vahenditega:
- Konfiguratsioon: XML, annotatsioonid (
@Autowired,@Inject), JavaConfig (@Configuration,@Bean). - Refleksioon: Spring skaneerib klasse, annotatsioone ja metaandmeid, et määrata bean'id ja nende sõltuvused.
- Konfiguratsioon: XML, annotatsioonid (
- Spring konteiner (tavaliselt
-
Aspekt-õpetatud programmeerimine (Aspect-Oriented Programming - AOP):
- Võimaldab moodustada ühiseid aspekte (nagu logimine, turvalisus, tehingute haldamine).
- Need aspektid realiseeritakse kui aspektid, mida saab rakendada erinevatesse ühenduspunktidesse programmi täitmisel.
- Spring AOP kasutab proxy'd (JDK Dynamic Proxies või CGLIB), et püüda meetodite väljakutseid ja rakendada aspekte.
- Rakendatakse jooksvalt (runtime weaving).
-
Abstraktsioon:
- Spring pakub kõrgetasemelisi abstraktsioone madala taseme API-dele, lihtsustades arendust. Näited:
- Tehingute haldus (
PlatformTransactionManager) abstraktsioon erinevate rakenduste (JTA, JDBC, JPA) jaoks. - Andmetele juurdepääs (JDBC, JPA/Hibernate) pakub lihtsustatud malle (
JdbcTemplate,JpaTemplate) ja erandite käsitlemist. - MVC raamistik abstractib HTTP-päringute töötlemise.
- Tehingute haldus (
- Spring pakub kõrgetasemelisi abstraktsioone madala taseme API-dele, lihtsustades arendust. Näited:
-
Spring konteiner (
ApplicationContext):- Peamine komponent, mis haldab bean'e.
- Skaneerib klasse, loeb metaandmeid (konfiguratsioon), loob, konfigureerib ja haldab bean'ide elutsüklit.
- Registreerib bean'i definitsioone ja loob bean'ide eksemplare nõudmisel või käivitamisel (sõltuvalt nähtavuse piirkonnast ja hilisest initsialiseerimisest).
- Teostab Dependency Injection.
- Pakub teenuseid nagu lokaliseerimine, sündmuste avaldamine, ressursside laadimine.
-
Refleksioon:
- Laialdaselt kasutatakse:
- classpath'i skaneerimiseks annotatsioonidega klasside leidmiseks (
@Component,@Service,@Repository,@Controller). - annotatsioonide metaandmete lugemiseks (
@Autowired,@Value,@Transactional). - konstruktorite ja meetodite saamiseks, et luua bean'e ja sisestada sõltuvused.
- Dynaamiliste proxy objektide loomine AOP jaoks.
- classpath'i skaneerimiseks annotatsioonidega klasside leidmiseks (
- Laialdaselt kasutatakse:
-
Bean'i elutsükkel:
- Spring konteiner haldab bean'i elutsüklit, mis hõlmab:
- Objekti loomist.
- Sõltuvuste sisestamist.
BeanNameAware,BeanFactoryAware,ApplicationContextAwaretäitmist.BeanPostProcessortäitmist (postProcessBeforeInitialization).@PostConstructvõiafterPropertiesSettäitmist.- Initsialiseerimismeetodi täitmist, mis on määratud
@Beanvõi XML-is. - Bean'i kasutamist.
BeanPostProcessortäitmist (postProcessAfterInitialization).@PreDestroyvõidestroyableBeantäitmist.- Kustutamise meetodi täitmist, mis on määratud
@Beanvõi XML-is.
- Spring konteiner haldab bean'i elutsüklit, mis hõlmab:
// Näide @Autowired kasutamisest sõltuvuse sisestamiseks
@Component // Bean on Springi poolt hallatav
public class OrderService {
private final ProductRepository productRepository; // Sõltuvus
@Autowired // Spring sisestab siia ProductRepository eksemplari
public OrderService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
// ... teenuse meetodid
}
// Näide @Aspect kasutamisest AOP jaoks
@Aspect // See klass on aspekt
@Component
public class LoggingAspect {
// Punktkoht: iga meetod mis tahes klassis paketis com.example.service
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}
// Nõuanne: enne meetodi täitmist punktkohas serviceLayer
@Before("serviceLayer()")
public void logMethodCall(JoinPoint joinPoint) {
System.out.println("Calling method: " + joinPoint.getSignature().getName());
}
}
Spring toimib raamistikuna, mis haldab rakenduse struktuuri ja täitmist, kasutades IoC, DI ja AOP, et tagada modulaarsus, testitavus ja koodi hooldusmugavus. Ta abstraktsioon paljudest Java EE ja teiste tehnoloogiate keerukustest.