그해,이 큰 봄 가족은 인터뷰에서 저를 돋보이게했습니다.

머리말:

Spring 프레임 워크는 부트, 보안, jpa 등과 같은 많은 파생 제품이있는 제품군과 같습니다. 그러나 그들의 기초는 Spring의 ioc와 aop입니다. ioc는 의존성 주입을위한 컨테이너를 제공하고 aop은 단면 지향 프로그래밍을 해결 한 다음 두 가지를 기반으로 다른 확장 제품의 고급 기능을 구현합니다. 오늘은 Spring의 대가족 이야기를 꼼꼼히 이야기 해보자.
여기에 사진 설명 삽입

여기에 사진 설명 삽입

1. 왜 봄을 사용합니까?

Spring은 ioc 기술을 제공하며 컨테이너는 종속 객체를 관리하는 데 도움이되므로 종속 객체를 직접 만들고 관리 할 필요가 없으므로 프로그램을 더 쉽게 분리 할 수 ​​있습니다.
Spring은 트랜잭션 지원을 제공하여 트랜잭션 작업을보다 편리하게 만듭니다.
Spring은 특정 유형의 문제를보다 편리하게 처리 할 수있는 슬라이스 지향 프로그래밍을 제공합니다.
보다 편리한 프레임 워크 통합, Spring은 MyBatis, hibernate 등과 같은 다른 프레임 워크를 쉽게 통합 할 수 있습니다.

2. AOP가 무엇인지 설명하세요?

Aop은 사전 컴파일 및 런타임 동적 에이전트를 통해 프로그램 기능의 통합 유지 관리를 실현하는 측면 지향 프로그래밍 기술입니다.
간단히 말해, 로그 및 예외의 균일 한 처리와 같은 특정 "측면"(클래스) 문제를 균일하게 처리하는 프로그래밍 아이디어입니다.

또한 20 년 이상의 기업 인터뷰 지식 포인트와 다양한 Java 핵심 지식 포인트를 무료로 모아서 무료로 공유 할 수 있습니다. 면접에 매우 유용하다고 생각합니다. 정보를 원하시면 795983544 비밀 코드 CSDN을 클릭하세요 .

여기에 사진 설명 삽입

3. ioc가 무엇인지 설명하십시오.

ioc : Inversion of Control (중국어 : Inversion of Control)은 스프링의 핵심이며, 스프링 프레임 워크의 경우 spring은 객체의 수명주기와 객체 간의 관계를 제어하는 ​​역할을합니다.
간단히 말해서 제어는 내부 멤버에 대한 현재 개체의 제어를 의미합니다. 제어 반전은 이러한 종류의 제어가 현재 개체에서 관리되지 않고 다른 (클래스, 타사 컨테이너)에서 관리됨을 의미합니다.

4. 스프링의 주요 모듈은 무엇입니까?

스프링 코어 : 프레임 워크의 가장 기본적인 부분으로 ioc 및 종속성 주입 기능을 제공합니다.
spring context : 프레임 워크 스타일의 객체 접근 방법을 제공하는 코어 패키지를 기반으로 구축 된 컨텍스트 패키지.
spring dao : Data Access Object는 JDBC를위한 추상화 계층을 제공합니다.
spring aop : 측면 지향 프로그래밍 구현을 제공하여 인터셉터, 포인트 컷 등을 사용자 정의 할 수 있습니다.
Spring Web : 파일 업로드, 서블릿 리스너를 사용한 ioc 컨테이너 초기화, 웹용 ApplicationContext와 같은 웹 개발을위한 통합 기능을 제공합니다.
spring Web mvc : spring의 mvc 패키지는 웹 애플리케이션을위한 MVC (Model-View-Controller)의 구현을 제공합니다.

5. 스프링의 일반적인 주입 방법은 무엇입니까?

setter 속성 주입
생성자 주입
주석 메서드 주입

6. 스프링 실의 콩은 안전한가요?

Spring의 Bean은 기본적으로 단일 모드에 있으며 Spring 프레임 워크는 다중 스레드에서 단일 Bean을 캡슐화하지 않습니다.
사실, 대부분의 경우 스프링 빈은 상태 비 저장 (예 : dao 클래스)이고 모든 빈은 어느 정도 안전하지만 빈이 상태 저장 (예 : 뷰 모델 객체)이면 스레드 안전성을 보장하는 것은 개발자의 몫입니다. 가장 간단한 것은 bean의 범위를 변경하고 "singleton"을 "prototype"으로 변경하여 요청 bean이 new Bean ()과 동일하므로 스레드 안전성을 보장 할 수 있습니다.
상태는 데이터 저장 기능이있는 것입니다.
Stateless는 데이터를 저장하지 않음을 의미합니다.

7. 스프링은 어떤 범위의 빈을 지원합니까?

Spring은 다음과 같이 5 개의 범위를 지원합니다 :
singleton : spring ioc 컨테이너에는 하나의 bean 인스턴스 만 있고 bean은 시스템의 기본값 인 singleton 모드로 존재합니다.
prototype : 컨테이너에서 bean이 호출 될 때마다 새 예제가 생성됩니다. 각 getBean ()은 new Bean () 작업의 실행과 동일합니다.
웹 환경의 범위 :
요청 : 각 http 요청이 빈을 생성합니다.
세션 : 동일한 http 세션이 빈 인스턴스를 공유합니다.
글로벌 세션 : 포틀릿의 경우 컨테이너 : 각 포틀릿에는 별도의 세션이 있으므로 globalsession은 전역 http 세션을 제공합니다.
참고 : 빈의 빈번한 생성 및 폐기는 많은 성능 오버 헤드를 가져 오기 때문에 프로토 타입 범위를 사용하려면 신중한 생각이 필요합니다.

8. 스프링이 자동으로 콩을 조립하는 방법은 무엇입니까?

no : 자동 어셈블리가 없음을 의미하는 기본값이며 어셈블리에 명시적인 Bean 참조를 사용해야합니다.
byName : 빈의 이름에 따라 객체 의존성을 주입합니다.
byType : 유형에 따라 개체 종속성을 주입합니다.
생성자 : 생성자를 통해 종속성을 주입하려면 많은 매개 변수가 필요합니다.
autodetect : 컨테이너는 먼저 생성자를 통해 autowire에 의해 어셈블되고 그렇지 않은 경우 byType을 통해 자동으로 어셈블됩니다.

9. 스프링 트랜잭션의 구현 방법은 무엇입니까?

선언적 트랜잭션 : xml 구성 파일과 주석 메서드 (클래스에 @Transaction 주석 추가)를 기반으로 선언적 트랜잭션을 구현하는 두 가지 방법도 있습니다.
코딩 방법 : 코딩 형태로 관리 및 유지 관리 업무를 제공합니다.

10. Spring의 트랜잭션 격리에 대해 알려주세요?

여기에 사진 설명 삽입

Spring에는 5 개의 격리 수준이 있으며 기본값은 ISOLATION_DEFAULT (데이터베이스 설정 사용)이고 다른 4 개의 격리 수준은 데이터베이스 격리 수준과 일치합니다.
ISOLATION_DEFAULT : 기본 데이터베이스로 격리 수준을 설정하고 데이터베이스가 설정된 모든 것을 사용합니다.
ISOLATIONREADUNCOMMITTED : 커밋되지 않은 읽기, 가장 낮은 격리 수준, 트랜잭션이 커밋되기 전에 다른 트랜잭션에서 읽을 수 있음 (팬텀 읽기, 더티 읽기 및 반복 불가능한 읽기가 발생 함)
ISOLATIONREADCOMMITTED : 커밋 읽기, 트랜잭션이 커밋 된 후 다른 트랜잭션에서 읽을 수 있음 To (phantom reads, non-repeatable reads), SQL 서버의 기본 수준,
ISOLATIONREPEATABLEREAD : 반복 가능한 읽기, 동일한 데이터를 여러 번 읽을 때 해당 값이 트랜잭션 시작 부분의 내용과 일치하도록합니다. 읽기는 금지됩니다. 다른 트랜잭션의 커밋되지 않은 데이터 (팬텀 읽기 발생), MySQL의 기본 수준;
ISOLATION_SERIALIZABLE : 직렬화, 가장 비용이 많이 들고 가장 안정적인 격리 수준,이 격리 수준은 더티 읽기, 반복 불가능 읽기 및 팬텀 읽기를 방지 할 수 있습니다.
더티 읽기 : 트랜잭션이 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽을 수 있음을 나타냅니다. 예를 들어 트랜잭션이 레코드 A를 삽입하려고하는데 트랜잭션이 아직 커밋되지 않은 경우 다른 트랜잭션이 레코드 A를 읽으려고합니다.
반복 불가능 읽기 : 트랜잭션에서 동일한 데이터를 여러 번 읽는 것을 나타냅니다.
팬텀 읽기 : 동일한 트랜잭션 내의 여러 쿼리에서 반환 된 다른 결과 집합을 나타냅니다. 예를 들어, 동일한 트랜잭션 A의 첫 번째 쿼리에는 n 개의 레코드가 있지만 동일한 조건에서 두 번째 쿼리에는 n + 1 개의 레코드가 있는데 이는 환상으로 보입니다. 팬텀 읽기의 이유는 다른 트랜잭션이 첫 번째 트랜잭션 결과 집합의 데이터를 추가, 삭제 또는 수정하기 때문입니다. 동일한 레코드의 데이터 내용이 수정되면 모든 데이터 행의 레코드가 다소 늘어납니다.

11. spring mvc의 실행 과정에 대해 알려주세요.

spring mvc는 먼저 DispatcherServlet에 요청을 보냅니다.
DispatcherServlet은 요청을 처리하는 컨트롤러를 찾기 위해 하나 이상의 HandlerMapping을 쿼리합니다.
그런 다음 DispatcherServlet은 해당 컨트롤러에 요청을 제출합니다.
컨트롤러가 비즈니스 로직을 처리 한 후 ModelAndView를 반환합니다.
Dispathcher는 하나 이상의 ViewResolver 뷰 리졸버를 쿼리하여 ModelAndView 객체에 의해 지정된 뷰 객체를 찾습니다.
뷰 개체는 클라이언트로 다시 렌더링하는 역할을합니다.

12. Spring mvc의 구성 요소는 무엇입니까?

프론트 컨트롤러 DispatcherServlet.
컨트롤러 HandlerMapping 매핑.
프로세서 컨트롤러.
ModelAndView를 모델링하고 봅니다.
리졸버보기 ViewResolver.

13. @RequestMapping의 역할은 무엇입니까?

http 요청을 해당 클래스 / 메서드에 매핑합니다.

14. @Autowired의 역할은 무엇입니까?

@Autowired 클래스 멤버 변수, 메서드 및 생성자에 주석을 달아 자동 어셈블리 작업을 완료하고 @Autowired를 사용하여 set / get 메서드를 제거 할 수 있습니다.
스프링 부트 / 스프링 클라우드

15. 스프링 부츠 란 무엇입니까?

스프링 부트는 스프링을 제공하며 새로운 스프링 애플리케이션의 초기 설정 및 개발을 단순화하는 데 사용됩니다.

16. 왜 스프링 부츠를 사용합니까?

간단한 구성,
독립 실행 형 작동,
자동 조립,
코드 생성 및 xml 구성 없음
, 애플리케이션 모니터링,
사용하기 쉬움,
개발 효율성 향상

17. 스프링 부트의 핵심 구성 파일은 무엇입니까?

스프링 부트의 핵심에있는 두 개의 구성 파일 :
부트 스트랩 (. yml 또는. properties) : boostrap은 applicato보다 먼저로드되는 부모 ApplicationContext에 의해로드되며 boostrap의 속성은 덮어 쓸 수 없습니다
.application (.yml 또는. properties) : 스프링 부트 프로젝트의 자동 구성.

18. 어떤 유형의 스프링 부트 구성 파일이 있습니까? 그들 사이의 차이점은 무엇입니까?

구성 파일에는 .properties 형식과 .yml 형식이 있으며 두 가지 주요 차이점은 서체 스타일입니다.
속성 구성은 다음과 같습니다 :
spring. RabbitMQ. port =
5672. yml 구성은 다음과 같습니다 :
spring :
RabbitMQ :
port : 5672.
yml 형식은 @PropertySource 주석 가져 오기를 지원하지 않습니다.

19. 스프링 부트의 핫 배포를 달성하는 방법은 무엇입니까?

devtools를 사용하여 핫 배포를 시작하고, devtools 라이브러리를 추가하고, 구성 파일에서 spring. devtools. restart.를 true로 설정하고,
Intellij Idea 편집기를 사용하여 수동으로 자동 컴파일하거나 재 컴파일하십시오.

20. 봄 구름이란 무엇입니까?

Spring 클라우드는 일련의 프레임 워크의 정렬 된 컬렉션입니다. 스프링 부트의 개발 편의성을 사용하여 서비스 검색 등록, 구성 센터, 메시지 버스,로드 밸런싱, 회로 차단기, 데이터 모니터링 등과 같은 분산 시스템 인프라의 개발을 영리하게 단순화하며, 모두 스프링 부트 개발 스타일로 수행 할 수 있습니다. 원 클릭 실행 및 배포.

21. 봄 구름 차단기의 기능은 무엇입니까?

분산 형 아키텍처에서 회로 차단기 모드의 기능은 유사합니다. 서비스 장치가 실패하면 (전기 제품의 단락과 유사) 회로 차단기의 오류 모니터링 (퓨즈가 끊어진 것과 유사)이 호출자에게 오류 응답을 반환합니다. 오랜 시간을 기다리는 대신. 이렇게하면 오류 서비스 호출로 인해 스레드가 오랫동안 점유되지 않고 분산 시스템에서 오류가 확산되는 것을 방지 할 수 있습니다.

22. 스프링 클라우드의 핵심 구성 요소는 무엇입니까?

유레카 : 서비스가 검색에 등록되었습니다.
Feign : 동적 프록시 메커니즘을 기반으로, 주석 및 선택한 시스템에 따라 요청을 시작하기 위해 요청 URL 주소를 연결합니다.
리본 :로드 밸런싱을 수행하려면 서비스의 여러 컴퓨터에서 하나를 선택합니다.
Hystrix : 스레드 풀을 제공하고 다른 서비스는 다른 스레드 풀을 사용하여 다른 서비스 호출의 격리를 실현하고 서비스 눈사태의 문제를 방지합니다.
Zuul : 게이트웨이 관리, Zuul 게이트웨이는 요청을 해당 서비스로 전달합니다.
최대 절전 모드

23. 왜 최대 절전 모드를 사용합니까?

Hibernate는 데이터 액세스 계층의 지루하고 반복적 인 코드를 크게 단순화하는 jdbc의 캡슐화입니다.
Hibernate는 뛰어난 ORM 구현으로, DAO 계층의 코딩 기능을 상당히 단순화합니다.
데이터베이스 이식을 쉽게 수행 할 수 있습니다.
프로그램 실행 변경에 효율적인 캐싱 메커니즘을 제공합니다.

24. ORM 프레임 워크는 무엇입니까?

ORM (Object Relation Mapping) 개체 관계형 매핑은 데이터베이스의 관계형 데이터를 프로그램의 개체로 매핑하는 것입니다.
ORM 사용의 장점 : 개발 효율성 향상, 개발 비용 감소, 개발 용이성, 객체 지향성 및 이식성 향상.

25. 최대 절전 모드에서 콘솔에서 인쇄 된 SQL 문을 보는 방법은 무엇입니까?

Config에서 hibernate.show_SQL을 true로 설정하십시오. 그러나 프로그램의 효율성을 떨어 뜨릴 수 있으므로 켜는 것은 권장하지 않습니다.

26. 최대 절전 모드에는 몇 개의 쿼리 메서드가 있습니까?

세 가지 유형 : hql, 원시 SQL 및 조건부 쿼리 기준.

27. 하이버 네이트 엔티티 클래스를 final로 정의 할 수 있습니까?

엔티티 클래스는 최종 클래스로 정의 할 수 있지만이 경우 하이버 네이트 프록시 모드에서 지연된 연관성을 사용하여 성능을 제공 할 수 없으므로 엔티티 클래스를 최종 클래스로 정의하지 않는 것이 좋습니다.

28. 최대 절전 모드에서 매핑을 위해 Integer와 int를 사용하는 것의 차이점은 무엇입니까?

Integer 유형은 객체이며 그 값은 null이 될 수 있지만 int는 기본 데이터 유형에 속하며 값은 null이 될 수 없습니다.

29. 최대 절전 모드는 어떻게 작동합니까?

구성 파일을 읽고 구문 분석합니다.
매핑 파일을 읽고 구문 분석하고 SessionFactory를 만듭니다.
세션을 엽니 다.
거래를 생성합니다.
지속성 작업을 수행합니다.
트랜잭션을 커밋하십시오.
세션을 닫습니다.
SessionFactory를 닫습니다.

30. get ()과 load ()의 차이점은 무엇입니까?

데이터를 쿼리 할 때 OID로 지정된 객체가 없으면 get ()은 null을 반환하고 load ()는 프록시 객체를 반환합니다.
load ()는 지연로드를 지원하고 get ()은 지연로드를 지원하지 않습니다.

31. 최대 절전 모드의 캐싱 메커니즘에 대해 알려주시겠습니까?

일반적으로 사용되는 최대 절전 모드 캐시에는 레벨 1 캐시 및 레벨 2 캐시가 포함됩니다.
레벨 1 캐시 : 세션 캐시라고도하며 세션 범위 내에서만 유효하며 사용자 개입이 필요하지 않으며 최대 절전 모드 자체에 의해 유지되며 다음을 통해 객체 캐시를 지울 수 있습니다. evict (object) ; Clear ()는 첫 번째 수준 캐시의 모든 캐시를 지우고 flush ()는 캐시를 플러시합니다.
두 번째 수준 캐시 : 모든 세션에서 유효한 애플리케이션 수준 캐시는 EhCache와 같은 타사 캐시의 구성을 지원합니다.

32. 최대 절전 모드 개체의 상태는 무엇입니까?

임시 / 일시적 상태 : 직접적으로 새로운 개체, 개체가 지속되지 않았으며 (데이터베이스에 저장되지 않음) 세션에서 관리되지 않는 개체입니다.
Persistent state : Session의 save / saveOrupdate / get / load / list 메소드가 호출되면 객체는 지속적 상태입니다.
자유 상태 : 세션이 닫힌 후 개체가 사용 가능합니다.

33. 최대 절전 모드에서 getCurrentSession과 openSession의 차이점은 무엇입니까?

getCurrentSession은 현재 스레드를 바인딩하지만 openSession은 바인딩하지 않습니다.
getCurrentSession 트랜잭션은 Spring에 의해 제어되며 수동으로 닫을 필요가없는 반면 openSession은 트랜잭션을 수동으로 열고 커밋해야합니다.

34. 하이버 네이트 엔티티 클래스는 매개 변수없는 생성자를 가져야합니까? 왜?

Hibernate 프레임 워크는 ClassnewInstance ()를 호출하여 엔티티 클래스의 인스턴스를 생성하기 위해 리플렉션 API를 사용하기 때문에 hibernate의 각 엔티티 클래스는 매개 변수없는 생성자를 제공해야합니다. 매개 변수없는 생성자가없는 경우 예외가 발생합니다.
MyBatis

35. # {}와 MyBatis의 차이점은 무엇입니까? # 사전 컴파일 된 처리입니까? {}의 차이점은 무엇입니까? # {}은 사전 컴파일 처리입니다. 차이점은 무엇입니까?

이 #은 사전 컴파일 처리이고 {}는 문자 교체입니다. # {}를 사용하면 MyBatis는 SQL의 # {}를 "?"로 대체하고 PreparedStatement의 set 메소드와 협력하여 값을 할당함으로써 SQL 주입을 효과적으로 방지하고 프로그램의 안전한 작동을 보장 할 수 있습니다.

36. MyBatis에는 몇 개의 페이징 방법이 있습니까?

페이징 모드 : 논리적 페이징 및 물리적 페이징.
논리적 페이징 : MyBatis와 함께 제공되는 RowBounds를 페이징에 사용합니다. 한 번에 많은 데이터를 쿼리 한 다음 데이터에서 검색합니다.
물리적 페이징 : SQL 페이징을 직접 작성하거나 페이징 플러그인 PageHelper를 사용하여 데이터베이스에서 지정된 페이징 데이터의 형식을 쿼리합니다.

37. RowBounds는 모든 결과를 한 번에 쿼리합니까? 왜?

RowBounds 표면은 "모든"데이터의 데이터를 검색하는 것입니다. 사실 MyBatis는 jdbc의 패키지이기 때문에 한 번에 모든 데이터를 쿼리하는 것이 아닙니다. jdbc 드라이버에는 매번 데이터베이스에서 최대 쿼리를 지정하는 Fetch Size 구성이 있습니다. 더 많은 데이터를 쿼리하려면 next ()를 실행할 때 더 많은 데이터를 쿼리합니다. 1 만 위안을 인출하기 위해 ATM에가는 것과 같지만 ATM은 매번 최대 2,500 위안을 인출 할 수 있으므로 4 번 인출해야 돈을 인출 할 수 있습니다. 그러나 jdbc의 경우 next ()를 호출하면 자동으로 쿼리가 완료됩니다. 이것의 이점은 효과적으로 메모리 오버 플로우를 방지 할 수 있습니다.
Fetch Size 공식 문서 : http : // t. cn / EfSE2g3

38. MyBatis에서 논리적 페이징과 물리적 페이징의 차이점은 무엇입니까?

논리적 페이징은 한 번에 많은 데이터를 쿼리 한 다음 결과에서 페이징 된 데이터를 검색하는 것입니다. 이것의 단점은 많은 메모리를 소비하고 메모리 오버플로의 위험이 있으며 데이터베이스에 많은 부담을 준다는 것입니다.
물리적 페이징은 데이터베이스에서 지정된 수의 데이터를 쿼리하는 것으로, 대용량 메모리 필요 및 데이터베이스 쿼리에 대한 부담과 같은 한 번에 발견되는 모든 데이터의 모든 단점을 보완합니다.

39. MyBatis는 지연 로딩을 지원합니까? 지연 로딩의 원리는 무엇입니까?

MyBatis는 지연 로딩을 지원합니다. lazyLoadingEnabled = true로 설정하면됩니다.
지연로드의 원칙은 초기화 할 때 정보를로드하는 것이 아니라 호출 될 때로드를 트리거하는 것입니다. 예를 들어, a. getB (). getName ()을 호출하면 이때 a. getB ()의 값이 null 인 것을 알 수 있습니다. 이때 미리 저장된 B 객체와 관련된 SQL을 별도로 트리거하고 B를 먼저 조회 한 다음 a. setB (b), 그리고 a.getB (). getName ()을 호출하여 값을 갖습니다. 이것이 지연 로딩의 기본 원칙입니다.

40. MyBatis의 기본 캐시와 보조 캐시에 대해 알려주세요.

레벨 1 캐시 : PerpetualCache를 기반으로하는 HashMap 로컬 캐시. 수명주기는 SQLSession과 일치합니다. 분산 환경에 여러 SQLSession 또는 데이터베이스 작업이있는 경우 더티 데이터가 발생할 수 있습니다. 세션 플러시 또는 닫기 후에 세션의 모든 캐시가 비워지고 첫 번째 수준 캐시가 기본적으로 활성화됩니다.
2 단계 캐시 : PerpetualCache를 기반으로하는 HashMap 로컬 캐시. 차이점은 저장소 범위가 매퍼 수준이라는 것입니다. 여러 SQLSession이 캐시를 공유해야하는 경우 2 단계 캐시를 사용해야하며 2 단계 캐시는 저장소 소스를 사용자 정의 할 수 있습니다. , Ehcache와 같은. 2 단계 캐시는 기본적으로 설정되어 있지 않습니다. 2 단계 캐시를 활성화하려면 2 단계 캐시 속성 클래스를 사용하여 직렬화 가능 직렬화 인터페이스 (객체 상태를 저장하는 데 사용할 수 있음)를 구현해야합니다.
2 단계 캐시 데이터 쿼리 프로세스를 엽니 다. 2 단계 캐시-> 1 단계 캐시-> 데이터베이스.
캐시 업데이트 메커니즘 : 특정 범위 (첫 번째 수준 캐시 세션 / 두 번째 수준 캐시 매퍼)가 C / U / D 작업을 수행 할 때 기본적으로이 범위 아래에서 선택된 모든 캐시가 지워집니다.

41. MyBatis와 최대 절전 모드의 차이점은 무엇입니까?

유연성 : MyBatis는 더 유연하여 SQL 문을 직접 작성할 수 있으므로 사용하기 더 편리합니다.
이식성 : MyBatis는 각 데이터베이스의 SQL이 다를 수 있기 때문에 자체적으로 많은 SQL을 작성하여 이식성이 상대적으로 열악합니다.
학습 및 사용 임계 값 : MyBatis는 시작하기가 비교적 간단하며 사용 임계 값도 낮습니다.
2 단계 캐시 : 최대 절전 모드는 2 단계 캐시가 더 우수하며 2 단계 캐시는 타사 2 단계 캐시로 대체 될 수 있습니다.

42. MyBatis에는 어떤 집행자 (Executor)가 있습니까?

MyBatis에는 세 가지 기본 Executor 실행기가 있습니다.
SimpleExecutor : 업데이트 또는 선택이 실행될 때마다 Statement 객체를 열고 사용되는
즉시 Statement 객체를 닫습니다 .ReuseExecutor : update 또는 select를 실행하고 SQL을 키로 사용하여 Statement 객체를 찾고, 존재하는 경우이를 사용합니다. 존재하면 생성되며, Statement 객체는 사용 후 닫히지 않고 다음 사용을 위해 Map에 배치됩니다. 즉, 그것은 정책 개체를 재사용하는 것이다
실행기 : 배치 모든 SQL 추가 (JDBC 일괄 처리 선택을 지원하지 않음을 선택) (addBatch ()), 통일 된 실행 대기 (가 executeBatch를 ()) 업데이트를 실행 여러 Statement 객체를 캐시하고 각 Statement 객체는 addBatch ()가 완료된 후 executeBatch () 일괄 처리를 기다립니다. 이는 jdbc 일괄 처리와 동일합니다.

43. MyBatis 페이징 플러그인의 실현 원리는 무엇입니까?

페이징 플러그인의 기본 원리는 MyBatis에서 제공하는 플러그인 인터페이스를 사용하여 사용자 지정 플러그인을 구현하고, 플러그인의 차단 방법에서 실행할 SQL을 가로 챈 다음 SQL을 다시 작성하고, 방언에 따라 해당 물리적 ​​페이징 명령문과 물리적 페이징 매개 변수를 추가하는 것입니다.

44. MyBatis 용 사용자 정의 플러그인을 작성하는 방법은 무엇입니까?


사용자 정의 플러그인 의 구현 원칙 MyBatis 사용자 정의 플러그인은 MyBatis의 네 가지 주요 개체 (Executor, StatementHandler, ParameterHandler, ResultSetHandler)를
인터셉트합니다 . Executor : 데이터베이스를 운영하기 위해 StatementHandler를 호출하고 ResultSetHandler를 통해 결과 집합을 자동으로 매핑하는 내부 실행기를 인터셉트합니다. 또한 2 단계 캐시의 작업도 처리합니다.
StatementHandler : SQL 문법 구성 처리를 가로 채고 데이터베이스에서 SQL 스크립트를 직접 실행하는 것이 MyBatis의 객체이며 MyBatis의 1 단계 캐시도 구현합니다 .ParameterHandler
: 매개 변수 처리를 가로 챕니다.
ResultSetHandler : 결과 세트의 처리를 가로 챕니다.
사용자 정의 플러그인 구현 키
MyBatis 플러그인은 인터셉터 인터페이스를 구현해야합니다. 인터페이스에 포함 된 메소드는 다음과 같습니다.

public interface Interceptor {
    
    
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
}

setProperties 메서드는 MyBatis에서 플러그인을 구성 할 때 사용자 지정 관련 속성을 구성하는 것입니다. 즉, 인터페이스 구현 개체의 매개 변수 구성입니다.
플러그인 메서드는 플러그인에서 대상 개체를 캡슐화하는 데 사용됩니다.이 메서드를 통해 대상 개체 자체를 반환하거나 반환 할 수 있습니다. 에이전트 중 하나는 인터셉트 여부를 결정한 후 어떤 종류의 대상 객체를 반환할지 결정할 수 있습니다. 공식 예제가 제공됩니다 : return Plugin. wrap (target, this);
인터셉트 메소드는 인터셉트 할 때 실행되는 메소드입니다.
사용자 정의 플러그인 구현 예
공식 플러그인 구현 :

@Intercepts({
    
    @Signature(type = Executor. class, method = “query”,
args = {
    
    MappedStatement. class, Object. class, RowBounds. class, ResultHandler. class})})
public class TestInterceptor implements Interceptor {
    
    
public Object intercept(Invocation invocation) throws Throwable {
    
    
Object target = invocation. getTarget(); //被代理对象
Method method = invocation. getMethod(); //代理方法
Object[] args = invocation. getArgs(); //方法参数
// do something . . . . . . 方法拦截前执行代码块
Object result = invocation. proceed();
// do something . . . . . . . 方法拦截后执行代码块
return result;
}
public Object plugin(Object target) {
    
    
return Plugin. wrap(target, this);
}
}

45. spring mvc와 struts의 차이점은 무엇입니까?

차단 수준 : struts2는 클래스 수준 차단이고 spring mvc는 메서드 수준 차단입니다.
데이터 독립성 : spring mvc의 메소드는 기본적으로 독립적이고, 요청과 응답 데이터는 독점적으로 공유되고, 요청 데이터는 매개 변수를 통해 얻어지며, 처리 결과는 ModelMap을 통해 프레임 워크로 반환됩니다. 변수는 메소드간에 공유되지 않으며 struts2는 메소드간에 변수를 공유하지 않습니다. 또한 독립적이지만 모든 동작 변수가 공유되어 프로그램 작동에 영향을 미치지 않지만 프로그램을 코딩하고 읽을 때 약간의 문제가 발생합니다.
인터 셉션 메커니즘 : Struts2에는 자체 인터셉터 메커니즘이 있으며 spring mvc는 독립적 인 aop 메소드를 사용하므로 spring mvc보다 struts2에 대한 구성 파일이 더 많습니다.
ajax 지원 : spring mvc는 ajax를 통합하고, 모든 ajax는 사용하기 매우 편리하며, @ResponseBody 주석 만 달성 할 수 있으며, struts2는 일반적으로 플러그인을 설치하거나 코드를 작성해야합니다.

5. 마지막으로 :

최근 인터뷰를 많이하시는 분들이 많다는 점을 감안하여 여기에 인터뷰 주제 자료와 다른 대기업의 경험도 많이 모았습니다. 모두에게 도움이되기를 바랍니다.

아래의 인터뷰 질문에 대한 답변은 문서 노트에 정리되어 있습니다. 또한 2020 년에 일부 대기업에서 수집 한 인터뷰 자료와 최신 인터뷰 질문을 분류했습니다 (모두 문서로 구성됨 , 스크린 샷의 작은 부분), 필요한 경우 클릭하여 비밀 CSDN을 입력 할 수 있습니다.

여기에 사진 설명 삽입

여기에 사진 설명 삽입

추천

출처blog.csdn.net/banzhuanhu/article/details/109299458