mysql tutorial 칼럼에서는 Spring에 대해 마스터해야 할 사항을 소개합니다.
안녕하세요 여러분! 나는 조양족의 열정적인 일원이다.
Spring 프레임워크에는 인터뷰에서 꼭 물어봐야 할 질문이 정확히 무엇인가요? 살펴 보겠습니다. 이는 제가 인터뷰에서 자주 묻는 질문이기도 하며, 프레임워크를 이해하는 프로그래머의 능력을 반영하기도 합니다.
Spring은 개발자의 개발 효율성과 시스템 유지 관리성을 향상시키기 위해 설계된 경량 프레임워크입니다.
우리가 일반적으로 Spring Framework라고 부르는 것은 많은 모듈의 모음입니다. 이러한 모듈을 사용하면 개발에 쉽게 도움이 될 수 있습니다. 이러한 모듈은 핵심 컨테이너, 데이터 액세스/통합, 웹, AOP(측면 지향 프로그래밍), 도구, 메시징 및 테스트 모듈입니다. 예를 들어 Core Container의 Core 컴포넌트는 모든 Spring 컴포넌트의 핵심이고, Beans 컴포넌트와 Context 컴포넌트는 IOC와 DI 구현을 위한 기반이며, AOP 컴포넌트는 관점 지향 프로그래밍을 구현하는 데 사용됩니다.
봄의 6가지 특징:
IOC(Inversion Of Control, Control In) 벌스(턴)은 디자인 아이디어이고, 이는 원래 프로그램에서 수동으로 생성된 객체의 제어가 관리를 위해 Spring 프레임워크로 넘겨진다는 것을 의미합니다. IOC는 다른 언어에서도 사용되며 Spring에만 국한되지 않습니다. IOC 컨테이너는 Spring이 IOC를 구현하는 데 사용하는 캐리어입니다. IOC 컨테이너는 실제로 Map(키, 값)이며 다양한 객체가 Map에 저장됩니다.
IOC 컨테이너에서 관리할 객체 간의 상호의존성을 남겨두고 IOC 컨테이너가 객체 주입을 완료합니다. 이를 통해 애플리케이션 개발을 크게 단순화하고 애플리케이션을 복잡한 종속성으로부터 해방시킬 수 있습니다. IOC 컨테이너는 객체를 생성해야 할 때 객체 생성 방법을 고려하지 않고 구성 파일/주석만 구성하면 됩니다. 실제 프로젝트에서 서비스 클래스는 하위 계층으로 수백 또는 수천 개의 클래스를 가질 수 있습니다. 이 서비스를 인스턴스화해야 하는 경우 매번 이 서비스의 모든 기본 클래스의 생성자를 파악해야 할 수 있으며 이는 혼란스러울 수 있습니다. 사람들. 미친 듯이 운전해. IOC를 사용하는 경우 이를 구성하고 필요한 곳에 참조하기만 하면 프로젝트의 유지 관리성이 크게 향상되고 개발 난이도가 줄어듭니다.
Spring 시대에는 주로 XML 파일을 통해 Bean을 구성했지만 나중에 개발자들은 XML 파일을 사용하여 Bean을 구성하는 것이 좋지 않다고 느꼈기 때문에 점차 Spring Boot 주석 구성이 대중화되었습니다.
AOP(관점 지향 프로그래밍)은 비즈니스와 관련이 없지만 일반적으로 비즈니스 모듈에서 호출하는 논리나 책임(트랜잭션 처리, 로그 관리 등)을 결합할 수 있습니다. , 권한 제어 등)은 시스템에서 중복 코드를 줄이고, 모듈 간의 결합을 줄이고, 향후 확장성과 유지 관리성을 용이하게 하기 위해 캡슐화됩니다.
Spring AOP는 동적 프록시를 기반으로 합니다. 프록시할 개체가 특정 인터페이스를 구현하는 경우 Spring AOP는 JDK 동적 프록시를 사용하여 인터페이스를 구현하지 않는 개체의 경우 JDK 동적 프록시를 사용할 수 없습니다. 대신 CGlib 동적 프록시를 사용하여 프록시 개체의 하위 클래스를 프록시로 생성하세요.
물론 AspectJ를 사용할 수도 있습니다. AspectJ는 Java 생태계에서 가장 완벽한 AOP 프레임워크로 간주되어야 합니다. AOP를 사용한 후 몇 가지 일반적인 기능을 추상화하여 필요한 곳에 직접 사용할 수 있으므로 코드 양이 크게 단순화될 수 있습니다. 새로운 기능을 편리하게 추가하고 시스템의 확장성을 높여야 합니다. AOP는 로깅 기능, 트랜잭션 관리, 권한 관리 등의 시나리오에 사용됩니다.
Spring AOP는 런타임 향상이지만 AspectJ는 컴파일 타임 향상입니다. Spring AOP는 Proxying을 기반으로 하는 반면 AspectJ는 Bytecode Manipulation을 기반으로 합니다.
Spring AOP에는 Java 생태계에서 가장 완벽한 AOP 프레임워크로 간주되어야 하는 AspectJ가 통합되어 있습니다. AspectJ는 Spring AOP보다 강력하지만 Spring AOP는 비교적 간단합니다.
측면 수가 적으면 둘 사이의 성능 차이가 거의 없습니다. 그러나 측면이 너무 많으면 SpringAOP보다 훨씬 빠른 AspectJ를 선택하는 것이 가장 좋습니다.
대부분의 경우 시스템에서는 멀티스레딩을 사용하지 않으므로 이 문제에 관심을 두는 사람은 거의 없습니다. 싱글톤 Bean에는 스레딩 문제가 있습니다. 주로 여러 스레드가 동일한 객체를 작동할 때 이 객체의 비정적 멤버 변수에 대한 쓰기 작업으로 인해 스레드 안전 문제가 발생하기 때문입니다.
두 가지 일반적인 해결 방법이 있습니다.
봄의 콩 수명주기?
이 문제에 관해 말하자면 Spring MVC가 없었던 이전 시대의 Model1과 Model2를 언급해야 합니다.
**Model1 시대:** Java를 늦게 배운 많은 백엔드 프로그래머는 Model1 모드의 Java 웹 애플리케이션 개발에 노출되지 않았을 수 있습니다. Model1 모드에서는 전체 웹 애플리케이션이 거의 모두 JSP 페이지로 구성되며 소수의 JavaBeans만 데이터베이스 연결, 액세스 및 기타 작업을 처리하는 데 사용됩니다. 이 모드에서 JSP는 제어 계층이자 프리젠테이션 계층입니다. 분명히 이 모델에는 많은 문제가 있습니다. 예를 들어 제어 로직과 성능 로직이 혼합되어 코드 재사용률이 매우 낮습니다. 또 다른 예로는 프런트엔드와 백엔드가 상호 의존적이어서 테스트가 어렵고 개발 효율성이 매우 낮습니다.
Model2 시대: Servlet을 공부하고 관련 데모를 해본 친구들은 Java Bean(모델) + JSP(View) + Servlet(Controller)의 개발 모델을 이해해야 합니다. 이것이 초기 Java Web MVC 개발 모델입니다. 모델은 시스템에 관련된 데이터입니다. 즉, 뷰는 단지 표시를 위해 모델의 데이터를 표시하는 데 사용됩니다. 컨트롤러는 처리를 위해 사용자 요청을 서블릿에 보내고 데이터를 JSP에 반환합니다. 사용자.
Model2 모드에는 여전히 많은 문제가 있습니다. Model2의 추상화 및 캡슐화 수준은 아직 충분하지 않습니다. 개발에 Model2를 사용하는 경우 휠을 다시 개발해야 하므로 프로그램의 유지 관리성과 재사용성이 크게 떨어집니다. 그 결과 Struts2 등 Java 웹 개발과 관련된 MVC 프레임워크가 많이 등장하게 되었지만, Struts2는 상대적으로 번거로워서 Spring 경량 개발 프레임워크의 인기로 인해 Spring 생태계에 Spring MVC 프레임워크가 등장하게 되었습니다. Spring MVC는 현재 최고의 MVC 프레임워크입니다. Struts2에 비해 Spring MVC는 사용이 더 간단하고 편리하며 개발 효율성이 더 높으며 Spring MVC가 더 빠르게 실행됩니다.
MVC는 디자인 패턴이고 Spring MVC는 뛰어난 MVC 프레임워크입니다. Spring MVC는 보다 간결한 웹 레이어를 개발하는 데 도움이 되며 자연스럽게 Spring 프레임워크와 통합됩니다. Spring MVC에서는 일반적으로 백엔드 프로젝트를 서비스 계층(처리 비즈니스), Dao 계층(데이터베이스 작업), 엔터티 계층(엔티티 클래스), 컨트롤러 계층(프런트엔드 페이지에 데이터를 반환하는 제어 계층)으로 나눕니다.
Spring MVC의 간단한 도식 다이어그램은 다음과 같습니다.
프로세스 설명:
1. 클라이언트(브라우저)가 직접 요청을 보냅니다. DispatcherServlet.
2.DispatcherServlet은 요청 정보를 기반으로 HandlerMapping을 호출하고 요청에 해당하는 Handler를 파싱합니다.
3. 해당 핸들러(일반적으로 컨트롤러라고 함)로 구문 분석합니다.
4.HandlerAdapter는 Handler를 기반으로 실제 프로세서를 호출하여 요청을 처리하고 해당 비즈니스 로직을 실행합니다.
5. 프로세서는 비즈니스 처리를 마친 후 ModelAndView 개체를 반환합니다. Model은 반환된 데이터 개체이고 View는 논리적 보기입니다.
6. ViewResolver는 논리적 뷰를 기반으로 실제 뷰를 찾습니다.
7.DispatcherServlet은 반환된 Model을 View(뷰 렌더링)에 전달합니다.
8. 요청자(브라우저)에게 뷰를 반환합니다.
##Spring 프레임워크에서는 어떤 디자인 패턴이 사용되나요?
@Bean 주석 사용 예:
@Configurationpublic class AppConfig { @Bean public TransferService transferService() { return new TransferServiceImpl(); }}复制代码
위 코드는 다음 XML 구성과 동일합니다.
<beans> <bean id="transferService" class="com.common.TransferServiceImpl"/></beans>复制代码
다음 예는 @Component 주석을 통해 달성할 수 없습니다.
@Beanpublic OneService getService(status) { case (status) { when 1: return new serviceImpl1(); when 2: return new serviceImpl2(); when 3: return new serviceImpl3(); }}复制代码
我们一般使用@Autowired注解去自动装配bean。而想要把一个类标识为可以用@Autowired注解自动装配的bean,可以采用以下的注解实现:
在TransactionDefinition接口中定义了五个表示隔离级别的常量:
**ISOLATION_DEFAULT:**使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。
**ISOLATION_READ_UNCOMMITTED:**最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
**ISOLATION_READ_COMMITTED: **동시 트랜잭션에 의해 제출된 데이터 읽기를 허용하여 더티 읽기를 방지할 수 있지만 팬텀 읽기 또는 반복 불가능한 읽기가 계속 발생할 수 있습니다.
**ISOLATION_REPEATABLE_READ:** 동일한 데이터에 대한 다중 읽기 결과 field 데이터가 트랜잭션 자체에 의해 수정되지 않는 한 모두 일관성을 유지하므로 더티 읽기 및 반복 불가능한 읽기를 방지할 수 있지만 팬텀 읽기는 여전히 발생할 수 있습니다.
**ISOLATION_SERIALIZABLE: **ACID 격리 수준을 완전히 준수하는 가장 높은 격리 수준입니다. 모든 트랜잭션은 순서대로 하나씩 실행되므로 트랜잭션 간 간섭 가능성이 없습니다. 즉, 이 수준에서는 더티 읽기(dirty read), 반복 불가능한 읽기 및 팬텀 읽기(phantom read)를 방지할 수 있습니다. 그러나 이는 프로그램 성능에 심각한 영향을 미칩니다. 일반적으로 이 수준은 사용되지 않습니다.
트랜잭션 전파 동작을 나타내는 8개의 상수가 TransactionDefinition 인터페이스에 정의되어 있습니다.
**PROPAGATION_REQUIRED: **현재 트랜잭션이 존재하는 경우 트랜잭션에 참여하고, 현재 트랜잭션이 없으면 새 트랜잭션을 생성합니다.
PROPAGATION_SUPPORTS: 현재 트랜잭션이 있는 경우 트랜잭션에 참여하고, 현재 트랜잭션이 없으면 비트랜잭션 방식으로 계속 실행합니다.
PROPAGATION_MANDATORY: 현재 거래가 있으면 거래에 참여하고, 현재 거래가 없으면 예외를 발생시킵니다. (필수: 필수).
PROPAGATION_REQUIRES_NEW: 현재 거래가 존재하는 경우 현재 거래를 일시 중지합니다.
PROPAGATION_NOT_SUPPORTED: 비트랜잭션 모드로 실행됩니다. 현재 트랜잭션이 존재하는 경우 현재 트랜잭션이 일시 중지됩니다.
PROPAGATION_NEVER: 비트랜잭션 모드에서 실행되며 현재 트랜잭션이 존재하는 경우 예외가 발생합니다.
###기타 상황:
PROPAGATION_NESTED: 현재 트랜잭션이 존재하는 경우 현재 트랜잭션의 중첩 트랜잭션으로 실행할 트랜잭션을 생성합니다. 현재 트랜잭션이 없으면 값은 PROPAGATION_REQUIRED와 동일합니다.
이번 컨텐츠도 마스터하시고 계속 응원해주시길 바라겠습니다. 감사합니다.
더 많은 관련 무료 학습 권장 사항: mysql 튜토리얼(동영상)
위 내용은 모으다! 봄이 마스터해야 할 것의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!