>  기사  >  데이터 베이스  >  모으다! 봄이 마스터해야 할 것

모으다! 봄이 마스터해야 할 것

coldplay.xixi
coldplay.xixi앞으로
2020-09-29 18:05:122066검색

mysql tutorial 칼럼에서는 Spring에 대해 마스터해야 할 사항을 소개합니다.

안녕하세요 여러분! 나는 조양족의 열정적인 일원이다.

Spring 프레임워크에는 인터뷰에서 꼭 물어봐야 할 질문이 정확히 무엇인가요? 살펴 보겠습니다. 이는 제가 인터뷰에서 자주 묻는 질문이기도 하며, 프레임워크를 이해하는 프로그래머의 능력을 반영하기도 합니다.

Spring 프레임워크 소개

Spring은 개발자의 개발 효율성과 시스템 유지 관리성을 향상시키기 위해 설계된 경량 프레임워크입니다.

우리가 일반적으로 Spring Framework라고 부르는 것은 많은 모듈의 모음입니다. 이러한 모듈을 사용하면 개발에 쉽게 도움이 될 수 있습니다. 이러한 모듈은 핵심 컨테이너, 데이터 액세스/통합, 웹, AOP(측면 지향 프로그래밍), 도구, 메시징 및 테스트 모듈입니다. 예를 들어 Core Container의 Core 컴포넌트는 모든 Spring 컴포넌트의 핵심이고, Beans 컴포넌트와 Context 컴포넌트는 IOC와 DI 구현을 위한 기반이며, AOP 컴포넌트는 관점 지향 프로그래밍을 구현하는 데 사용됩니다.

봄의 6가지 특징:

  • 핵심 기술: DI(종속성 주입), AOP, 이벤트, 리소스, i18n, 유효성 검사, 데이터 바인딩, 유형 변환, SpEL
  • 테스트: 모의 객체, TestContext 프레임워크, Spring MVC 테스트, WebTestClient;
  • 데이터 액세스: 트랜잭션, DAO 지원, JDBC, ORM, Marshal XML;
  • 웹 지원: Spring MVC 및 Spring WebFlux 웹 프레임워크
  • 통합: Remoting, JMS, JCA, JMX, 이메일, 작업
  • 언어: Kotlin, Groovy, 동적 언어

아래 그림은 Spring 4 .x 버전인 포틀릿 구성 요소에 해당합니다. 최신 5.x 버전의 웹 모듈 중 일부는 폐기되었으며 비동기 응답 처리를 위한 WebFlux 구성 요소가 추가되었습니다.

  • Spring Core: 기본적으로 Spring의 다른 모든 기능은 이 클래스 라이브러리에 의존한다고 말할 수 있습니다. 주로 IOC 및 DI 기능을 제공합니다.
  • Spring Aspects: 이 모듈은 AspectJ와의 통합을 지원합니다.
  • Spring AOP: 관점 지향 프로그래밍 구현을 제공합니다.
  • Spring JDBC: Java 데이터베이스 연결.
  • Spring JMS: Java 메시징 서비스.
  • Spring ORM: Hibernate와 같은 ORM 도구를 지원하는 데 사용됩니다.
  • Spring Web: 웹 애플리케이션 생성을 지원합니다.
  • Spring Test: JUnit 및 TestNG 테스트를 지원합니다.

Spring IOC 및 AOP에 대한 이해에 대해 이야기해 주세요.

IOC

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

AOP(관점 지향 프로그래밍)은 비즈니스와 관련이 없지만 일반적으로 비즈니스 모듈에서 호출하는 논리나 책임(트랜잭션 처리, 로그 관리 등)을 결합할 수 있습니다. , 권한 제어 등)은 시스템에서 중복 코드를 줄이고, 모듈 간의 결합을 줄이고, 향후 확장성과 유지 관리성을 용이하게 하기 위해 캡슐화됩니다.

Spring AOP는 동적 프록시를 기반으로 합니다. 프록시할 개체가 특정 인터페이스를 구현하는 경우 Spring AOP는 JDK 동적 프록시를 사용하여 인터페이스를 구현하지 않는 개체의 경우 JDK 동적 프록시를 사용할 수 없습니다. 대신 CGlib 동적 프록시를 사용하여 프록시 개체의 하위 클래스를 프록시로 생성하세요.

물론 AspectJ를 사용할 수도 있습니다. AspectJ는 Java 생태계에서 가장 완벽한 AOP 프레임워크로 간주되어야 합니다. AOP를 사용한 후 몇 가지 일반적인 기능을 추상화하여 필요한 곳에 직접 사용할 수 있으므로 코드 양이 크게 단순화될 수 있습니다. 새로운 기능을 편리하게 추가하고 시스템의 확장성을 높여야 합니다. AOP는 로깅 기능, 트랜잭션 관리, 권한 관리 등의 시나리오에 사용됩니다.

Spring AOP와 AspectJ AOP의 차이점 AOP

Spring AOP는 런타임 향상이지만 AspectJ는 컴파일 타임 향상입니다. Spring AOP는 Proxying을 기반으로 하는 반면 AspectJ는 Bytecode Manipulation을 기반으로 합니다.

Spring AOP에는 Java 생태계에서 가장 완벽한 AOP 프레임워크로 간주되어야 하는 AspectJ가 통합되어 있습니다. AspectJ는 Spring AOP보다 강력하지만 Spring AOP는 비교적 간단합니다.

측면 수가 적으면 둘 사이의 성능 차이가 거의 없습니다. 그러나 측면이 너무 많으면 SpringAOP보다 훨씬 빠른 AspectJ를 선택하는 것이 가장 좋습니다.

봄에 콩의 범위는 어떻게 되나요?

  1. singleton: 유일한 Bean 인스턴스인 Spring의 Bean은 기본적으로 모두 싱글톤입니다.
  2. 프로토타입: 각 요청마다 새로운 Bean 인스턴스가 생성됩니다.
  3. request: 각 HTTP 요청은 현재 HTTP 요청 내에서만 유효한 새 Bean을 생성합니다.
  4. session: 각 HTTP 요청은 현재 HTTP 세션 내에서만 유효한 새 Bean을 생성합니다.
  5. global-session: 전역 세션 범위는 포틀릿 기반 웹 애플리케이션에서만 의미가 있으며 Spring 5에서는 더 이상 사용할 수 없습니다. 포틀릿은 HTML과 같은 의미 코드 조각을 생성할 수 있는 작은 Java 웹 플러그인입니다. 이는 포틀릿 컨테이너를 기반으로 하며 서블릿과 같은 HTTP 요청을 처리할 수 있습니다. 그러나 서블릿과 달리 각 포틀릿에는 다른 세션이 있습니다.

Spring의 싱글톤 Bean의 스레드 안전 문제를 이해하고 계십니까?

대부분의 경우 시스템에서는 멀티스레딩을 사용하지 않으므로 이 문제에 관심을 두는 사람은 거의 없습니다. 싱글톤 Bean에는 스레딩 문제가 있습니다. 주로 여러 스레드가 동일한 객체를 작동할 때 이 객체의 비정적 멤버 변수에 대한 쓰기 작업으로 인해 스레드 안전 문제가 발생하기 때문입니다.

두 가지 일반적인 해결 방법이 있습니다.

  1. Bean 개체에서 변경 가능한 멤버 변수를 정의하지 마세요(매우 현실적이지 않음).
  2. 클래스에 ThreadLocal 멤버 변수를 정의하고 필요한 변수 멤버 변수를 ThreadLocal에 저장합니다(권장 방법).

봄의 콩 수명주기?

  1. Bean 컨테이너는 구성 파일에서 Spring Bean 정의를 찾습니다.
  2. Bean 컨테이너는 Java Reflection API를 사용하여 Bean 인스턴스를 생성합니다.
  3. 일부 속성 값이 관련된 경우 set() 메서드를 사용하여 일부 속성 값을 설정하세요.
  4. Bean이 BeanNameAware 인터페이스를 구현하는 경우 setBeanName() 메서드를 호출하고 Bean 이름을 전달합니다.
  5. Bean이 BeanClassLoaderAware 인터페이스를 구현하는 경우 setBeanClassLoader() 메서드를 호출하고 ClassLoader 개체의 인스턴스를 전달합니다.
  6. Bean이 BeanFactoryAware 인터페이스를 구현하는 경우 setBeanClassFacotory() 메서드를 호출하고 ClassLoader 개체의 인스턴스를 전달합니다.
  7. 위와 마찬가지로 다른 *Aware 인터페이스가 구현되면 해당 메서드가 호출됩니다.
  8. 이 Bean을 로드하는 Spring 컨테이너와 관련된 BeanPostProcessor 객체가 있는 경우 postProcessBeforeInitialization() 메서드를 실행합니다.
  9. Bean이 초기화Bean 인터페이스를 구현하는 경우 afeterPropertiesSet() 메서드를 실행합니다.
  10. 구성 파일의 Bean 정의에 init-method 속성이 포함되어 있으면 지정된 메소드를 실행합니다.
  11. 이 Bean을 로드하는 Spring 컨테이너와 관련된 BeanPostProcess 객체가 있는 경우 postProcessAfterInitialization() 메서드를 실행합니다.
  12. Bean을 삭제하려는 경우 해당 Bean이 DisposableBean 인터페이스를 구현하는 경우 destroy() 메서드를 실행합니다.
  13. Bean을 삭제하고 싶을 때 구성 파일의 Bean 정의에 destroy-method 속성이 포함되어 있으면 지정된 메서드를 실행합니다.

Spring MVC에 대해 어떻게 이해하고 계시나요?

이 문제에 관해 말하자면 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의 간단한 도식 다이어그램은 다음과 같습니다.

Spring MVC의 작동 원리에 대해 이야기해 보세요.

프로세스 설명:

1. 클라이언트(브라우저)가 직접 요청을 보냅니다. DispatcherServlet.

2.DispatcherServlet은 요청 정보를 기반으로 HandlerMapping을 호출하고 요청에 해당하는 Handler를 파싱합니다.

3. 해당 핸들러(일반적으로 컨트롤러라고 함)로 구문 분석합니다.

4.HandlerAdapter는 Handler를 기반으로 실제 프로세서를 호출하여 요청을 처리하고 해당 비즈니스 로직을 실행합니다.

5. 프로세서는 비즈니스 처리를 마친 후 ModelAndView 개체를 반환합니다. Model은 반환된 데이터 개체이고 View는 논리적 보기입니다.

6. ViewResolver는 논리적 뷰를 기반으로 실제 뷰를 찾습니다.

7.DispatcherServlet은 반환된 Model을 View(뷰 렌더링)에 전달합니다.

8. 요청자(브라우저)에게 뷰를 반환합니다.

##Spring 프레임워크에서는 어떤 디자인 패턴이 사용되나요?

  1. Factory 디자인 패턴: Spring은 BeanFactory 및 ApplicationContext를 통해 Bean 객체를 생성하기 위해 팩토리 패턴을 사용합니다.
  2. 프록시 디자인 패턴: Spring AOP 기능 구현.
  3. 싱글톤 디자인 패턴: Spring의 Bean은 기본적으로 싱글톤입니다.
  4. Template 메소드 패턴: jdbcTemplate, hibernateTemplate 및 Spring에서 Template으로 끝나는 기타 클래스는 데이터베이스에서 작동하며 템플릿 패턴을 사용합니다.
  5. 래퍼 디자인 패턴: 우리 프로젝트는 여러 데이터베이스에 연결해야 하며, 다양한 고객이 방문할 때마다 필요에 따라 다양한 데이터베이스에 액세스하게 됩니다. 이 모델을 사용하면 고객 요구에 따라 다양한 데이터 소스 간에 동적으로 전환할 수 있습니다.
  6. Observer 패턴: Spring 이벤트 중심 모델은 Observer 패턴의 고전적인 응용 프로그램입니다.
  7. 어댑터 모드: Spring AOP 향상 또는 알림(Advice)은 어댑터 모드를 사용하고 Spring MVC도 컨트롤러를 적응시키기 위해 어댑터 모드를 사용합니다.

@Component와 @Bean의 차이점은 무엇인가요?

  1. 다양한 물체에 반응해보세요. @Component 주석은 클래스에 대해 작동하고 @Bean 주석은 메소드에 대해 작동합니다.
  2. @Component 주석은 일반적으로 클래스 경로 검색을 통해 자동으로 감지되고 Spring 컨테이너에 자동으로 어셈블됩니다(@ComponentScan 주석을 사용하여 검색할 경로를 정의할 수 있음). @Bean 주석은 일반적으로 이 Bean을 생성하기 위해 주석으로 표시된 메소드에 정의되어 Spring에게 이것이 특정 클래스의 인스턴스이고 이를 사용해야 할 때 나에게 반환된다는 것을 알려줍니다.
  3. @Bean 주석은 @Component 주석보다 사용자 정의가 더 용이하며 많은 곳에서 Bean은 @Bean 주석을 통해서만 등록할 수 있습니다. 예를 들어, 타사 라이브러리를 참조하는 클래스를 Spring 컨테이너로 조합해야 하는 경우 @Bean 주석을 통해서만 달성할 수 있습니다.

@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();    }}复制代码

将一个类声明为Spring的bean的注解有哪些?

我们一般使用@Autowired注解去自动装配bean。而想要把一个类标识为可以用@Autowired注解自动装配的bean,可以采用以下的注解实现:

  1. @Component注解。通用的注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪一个层,可以使用@Component注解标注。
  2. @Repository注解。对应持久层,即Dao层,主要用于数据库相关操作。
  3. @Service注解。对应服务层,即Service层,主要涉及一些复杂的逻辑,需要用到Dao层(注入)。
  4. @Controller注解。对应Spring MVC的控制层,即Controller层,主要用于接受用户请求并调用Service层的方法返回数据给前端页面。

Spring事务管理的方式有几种?

  1. 编程式事务:在代码中硬编码(不推荐使用)。
  2. 声明式事务:在配置文件中配置(推荐使用),分为基于XML的声明式事务和基于注解的声明式事务。

Spring事务中的隔离级别有哪几种?

在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)를 방지할 수 있습니다. 그러나 이는 프로그램 성능에 심각한 영향을 미칩니다. 일반적으로 이 수준은 사용되지 않습니다.

Spring 트랜잭션의 트랜잭션 전파 동작 유형은 무엇입니까?

트랜잭션 전파 동작을 나타내는 8개의 상수가 TransactionDefinition 인터페이스에 정의되어 있습니다.

현재 트랜잭션 지원:

**PROPAGATION_REQUIRED: **현재 트랜잭션이 존재하는 경우 트랜잭션에 참여하고, 현재 트랜잭션이 없으면 새 트랜잭션을 생성합니다.

PROPAGATION_SUPPORTS: 현재 트랜잭션이 있는 경우 트랜잭션에 참여하고, 현재 트랜잭션이 없으면 비트랜잭션 방식으로 계속 실행합니다.

PROPAGATION_MANDATORY: 현재 거래가 있으면 거래에 참여하고, 현재 거래가 없으면 예외를 발생시킵니다. (필수: 필수).

현재 거래가 지원되지 않습니다.

PROPAGATION_REQUIRES_NEW: 현재 거래가 존재하는 경우 현재 거래를 일시 중지합니다.

PROPAGATION_NOT_SUPPORTED: 비트랜잭션 모드로 실행됩니다. 현재 트랜잭션이 존재하는 경우 현재 트랜잭션이 일시 중지됩니다.

PROPAGATION_NEVER: 비트랜잭션 모드에서 실행되며 현재 트랜잭션이 존재하는 경우 예외가 발생합니다.

###기타 상황:

PROPAGATION_NESTED: 현재 트랜잭션이 존재하는 경우 현재 트랜잭션의 중첩 트랜잭션으로 실행할 트랜잭션을 생성합니다. 현재 트랜잭션이 없으면 값은 PROPAGATION_REQUIRED와 동일합니다.

End

이번 컨텐츠도 마스터하시고 계속 응원해주시길 바라겠습니다. 감사합니다.

더 많은 관련 무료 학습 권장 사항: mysql 튜토리얼(동영상)

위 내용은 모으다! 봄이 마스터해야 할 것의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제