집 >Java >Java인터뷰 질문들 >최신 Java 인터뷰 질문: Spring 프레임워크 부분
1. SpringMVC는 어떻게 작동하나요?
사용자가 서버에 요청을 보내고 springMVC 프런트엔드 컨트롤러 DispatchServlet에 의해 요청이 캡처됩니다.
DispatcherServle은 요청 URL을 구문 분석하고 요청 리소스 식별자(URL)를 얻은 다음 이를 기반으로 HandlerMapping을 호출합니다. 요청을 프로세서 HandlerExcutionChain에 매핑하는 URL입니다.
DispatchServlet은 획득한 Handler를 기반으로 처리에 적합한 HandlerAdapter 어댑터를 선택합니다.
Handler는 데이터 처리가 완료된 후 ModelAndView 객체를 DisPatchServlet에 반환합니다. DispatcherSevlet은 ViewResolver를 전달합니다. 파서를 사용하여 논리적 뷰를 실제 뷰로 변환하려고 합니다.
DispatcherServle은 모델을 통해 ModelAndView()의 매개변수를 구문 분석하고 최종적으로 전체 뷰를 표시하고 반환합니다.
2. SpringMVC에서 일반적으로 사용되는 주석은 무엇입니까?@RequestMapping은 URL 매핑을 요청하는 데 사용됩니다.
@RequestBody 주석은 http 요청의 json 데이터를 수신하고 json 데이터를 Java 객체로 변환하는 기능을 구현합니다.
@ResponseBody 주석은 컨트롤러 메서드에서 반환된 개체를 고객에 대한 json 응답으로 변환하는 것을 구현합니다.
3. 주석 프로세서 및 어댑터를 활성화하는 방법은 무엇입니까?저희 프로젝트에서는 일반적으로 springmvc.xml에서 주석 프로세서와 어댑터를 켜서 켭니다.
4. get 및 post의 왜곡된 문제를 해결하는 방법은 무엇입니까?왜곡된 게시물 요청을 해결하려면 web.xml에서 CharacterEncodingFilter 필터를 구성할 수 있습니다. utf-8로 설정하십시오. get 요청의 잘못된 코드를 해결하려면 두 가지 방법이 있습니다. get 요청의 잘못된 중국어 매개변수에 대한 두 가지 솔루션이 있습니다.
Tomcat 구성 파일을 수정하고 엔지니어링 인코딩과 일치하도록 인코딩을 추가합니다.
매개변수를 다시 인코딩하는 또 다른 방법은 String userName = new String(request.getParameter("userName").getBytes("ISO8859-1"), "utf-8");
5입니다. Spring에 대해 잘 알고 계시나요?Spring은 엔터프라이즈급 애플리케이션 개발을 단순화하기 위해 만들어진 오픈 소스 프레임워크입니다. Spring은 이전에 EJB만이 달성할 수 있었던 기능을 달성하기 위해 간단한 JavaBeans를 활성화할 수 있습니다. Spring은 IOC 및 AOP 컨테이너 프레임워크입니다.
Spring 컨테이너의 주요 핵심은 다음과 같습니다.제어 반전(IOC) 기존 Java 개발 모델에서는 객체가 필요할 때 new 또는 getInstance를 사용하여 생성자를 직접 또는 간접적으로 호출합니다. 객체. Spring 개발 모델에서는 Spring 컨테이너가 필요한 객체를 생성하기 위해 Factory 모델을 사용하는데, 이를 우리가 직접 생성할 필요가 없습니다. 통제의.
종속성 주입(DI), Spring은 JavaBean 객체의 set 메소드 또는 매개변수가 있는 생성자를 사용하여 필수 객체를 생성할 때 해당 속성을 필수 값으로 자동 설정하는 것이 의존성 주입 아이디어입니다.
AOP(관점 지향 프로그래밍)는 객체 지향 프로그래밍(oop) 아이디어에서 사물을 수직으로 객체로 하나씩 추출합니다. 관점 지향 프로그래밍에서는 각 개체의 특정 유사한 측면을 관점으로 수평 추출하고 이 측면에 대해 권한 제어, 트랜잭션 관리, 로깅 등과 같은 몇 가지 일반적인 작업을 수행합니다. 이것이 관점 지향의 아이디어입니다. 프로그래밍. AOP의 최하위 레이어는 동적 프록시입니다. 인터페이스가 JDK 동적 프록시를 사용하는 경우 클래스가 CGLIB를 사용하여 동적 프록시를 구현하는 경우
6.단일 케이스 모드 - Spring의 두 가지 프록시 메소드 대상 객체가 여러 인터페이스를 구현하는 경우 Spring은 jdk의 java.lang.reflect.Proxy 클래스 프록시를 사용합니다. 대상 구현이 인터페이스를 구현하지 않으면 Spring은 CGLIB 라이브러리를 사용하여 대상 클래스의 하위 클래스를 생성합니다. 싱글톤 모드 - 스프링 구성 파일에서 Bean을 싱글톤 모드의 기본값으로 설정합니다.
템플릿 모드 - 코드 중복 문제를 해결하는 데 사용됩니다. 예: RestTemplate, JmsTemplate, JpaTemplate
프런트 엔드 컨트롤러 모드 - 스프링은 요청을 분산하기 위해 프런트 엔드 컨트롤러 DispatherServlet을 제공합니다.
뷰 도우미 - Spring은 분산된 코드를 뷰에 통합하는 데 도움이 되는 일련의 JSP 태그와 효율적인 매크로를 제공합니다.
종속성 주입 - BeanFactory/AplacationContext 인터페이스를 통해 실행되는 핵심 개념입니다.
팩토리 패턴 - 팩토리 패턴에서는 객체 생성 시 생성 로직을 클라이언트에 노출하지 않고, 동일한 인터페이스를 사용하여 새로 생성된 객체를 가리킵니다. BeanFactory는 Spring에서 객체의 인스턴스를 생성하는 데 사용됩니다.
7.Spring에서 자주 사용하는 주석은?Spring은 버전 2.5 이후 종속성 주입을 구성하기 위한 주석을 지원하기 시작했습니다. 주석은 XML의 Bean 설명을 대체하는 데 사용될 수 있습니다. 주석 주입은 XML 주입 전에 컨테이너에 의해 처리되므로 후자는 동일한 속성에 대한 전자의 처리 결과를 덮어씁니다.
봄에는 주석 어셈블리가 기본적으로 꺼져 있습니다. 따라서 주석 기반 어셈블리 모드를 사용하려면 스프링 코어 구성 파일에서 이를 구성해야 합니다. 구성 방법은 다음과 같습니다.
일반적으로 사용되는 주석:
@필수: 이 주석은 값 설정 방법에 적용됩니다.
@Autowired: 이 주석은 값이 있는 setter 메서드, non-setter 메서드, 생성자 및 변수에 적용됩니다.
@Qualifier: 이 주석은 @Autowired와 함께 사용되어 특정 Bean의 자동 연결 모호성을 제거합니다.
8.스프링 빈즈의 라이프사이클을 간략히 소개하자면?
빈 정의 : 설정파일에서 정의하는데 사용한다.
Bean 초기화: 초기화하는 방법에는 두 가지가 있습니다. 구성 파일에 init-method 속성을 지정하여 수행됩니다. org.springframework.beans.factory.InitializingBean 인터페이스를 구현합니다.
Bean 호출: Bean 인스턴스를 가져와 호출하는 세 가지 방법이 있습니다.
Bean 파괴: 파괴하는 방법에는 두 가지가 있습니다. 구성 파일에 지정된 destroy-method 속성을 사용합니다. org.springframework.bean.factory.DisposeableBean을 구현합니다.
9. Spring 구조 다이어그램을 이해하셨나요?
코어 컨테이너: Core, Beans, Context 및 EL 모듈을 포함합니다. 핵심 모듈: 리소스 액세스, 유형 변환 및 일부 일반적인 도구 클래스를 포함하여 프레임워크 종속성의 가장 낮은 수준 부분을 캡슐화합니다.
Beans 모듈: 제어 반전 및 종속성 주입을 포함하여 프레임워크의 기본 부분을 제공합니다. 그중 BeanFactory는 컨테이너의 핵심입니다. 이는 본질적으로 "공장 디자인 패턴"의 구현이며 "단일 케이스 디자인 패턴"을 구현하기 위해 프로그래밍이 필요하지 않습니다. 단일 케이스는 컨테이너와 옹호자 인터페이스에 의해 완전히 제어됩니다. 구현 지향 프로그래밍이 아닌 지향 프로그래밍; 모든 애플리케이션 객체와 객체 간의 관계는 프로그램 로직에서 유지 관리되는 객체 간의 종속성을 실제로 추출하는 프레임워크에 의해 관리됩니다. 이러한 모든 종속성은 BeanFactory에 의해 유지됩니다.
컨텍스트 모듈: Core 및 Beans를 기반으로 Beans 모듈 기능을 통합하고 리소스 바인딩, 데이터 검증, 국제화, JavaEE 지원, 컨테이너 수명 주기, 이벤트 전파 등을 추가합니다. 핵심 인터페이스는 ApplicationContext입니다.
EL 모듈: 강력한 표현 언어 지원을 제공하고, 속성 값, 메서드 호출에 대한 액세스 및 수정을 지원하고, 배열, 컨테이너 및 인덱서, 명명된 변수에 대한 액세스 및 수정을 지원하고, 산술 및 논리 연산을 지원하고, Spring 컨테이너에서 Bean 가져오기도 지원합니다. 목록 투영, 선택, 일반 목록 집계 등을 지원합니다.
AOP, Aspect 모듈: AOP 모듈: Spring AOP 모듈은 AOPAlliance 사양을 준수하는 Aspect 지향 프로그래밍 구현을 제공하며 로깅, 권한 제어, 성능 통계, 비즈니스 로직 분리 기술 등의 공통 기능을 제공하며 이러한 기능은 이러한 방식으로 필요한 코드에 동적으로 추가하면 각 기능은 자체 임무에 전념하고 비즈니스 로직과 일반 기능 간의 결합을 줄입니다.
Aspects 모듈: SpringASP보다 더 강력한 기능을 제공하는 AspectJ 통합을 제공합니다. 데이터 액세스/통합 모듈: 이 모듈에는 JDBC, ORM, OXM, JMS 및 트랜잭션 관리가 포함됩니다.
트랜잭션 모듈: 이 모듈은 Spring 관리 트랜잭션에 사용됩니다. Spring 관리 트랜잭션의 이점을 얻을 수 있습니다. 코드에서 트랜잭션을 제어할 필요가 없으며 프로그래밍 및 선언적 트랜잭션 관리를 지원합니다. .
JDBC 모듈: JBDC 샘플 템플릿을 제공합니다. 이러한 템플릿을 사용하면 기존의 긴 JDBC 코딩과 필요한 트랜잭션 제어를 제거할 수 있으며 Spring 트랜잭션 관리의 이점을 누릴 수 있습니다.
ORM 모듈: Hibernate, JPA, MyBatis 등을 포함하여 널리 사용되는 "객체 관계형" 매핑 프레임워크와의 원활한 통합을 제공합니다. 그리고 추가적인 트랜잭션 제어 없이 Spring 트랜잭션 관리를 사용할 수 있습니다.
OXM 모듈: Java 개체를 XML 데이터로 매핑하거나 XML 데이터를 Java 개체로 매핑하는 개체/XML 매핑 구현을 제공합니다. 개체/XML 매핑 구현에는 JAXB, Castor, XMLBeans 및 XStream이 포함됩니다.
JMS 모듈: JMS(Java Messaging Service)에 사용되며 JMS를 보다 쉽게 사용할 수 있도록 "메시지 생성자, 메시지 소비자" 템플릿 집합을 제공합니다. JMS는 두 애플리케이션 또는 분산 시스템 간에 사용되며 비동기 통신을 위해 메시지를 보냅니다. 웹/원격 모듈: 웹/원격 모듈에는 웹, 웹 서블릿, 웹 스트럿츠 및 웹 포틀릿 모듈이 포함됩니다.
웹 모듈: 기본 웹 기능을 제공합니다. 예를 들어, 다중 파일 업로드, 통합 IoC 컨테이너, 원격 프로세스 액세스(RMI, Hessian, Burlap) 및 WebService 지원, RestTemplate 클래스가 제공되어 편리한 Restfulservices 액세스를 제공합니다.
Web-Servlet 모듈: SpringMVCWeb 프레임워크 구현을 제공합니다. SpringMVC 프레임워크는 주석 기반 요청 리소스 주입, 더 간단한 데이터 바인딩, 데이터 검증 등을 제공하며, 다른 Spring 기술과 완벽하게 원활하게 협력하는 사용하기 매우 쉬운 JSP 태그 세트를 제공합니다.
Web-Struts 모듈: Struts1.x 및 Struts2.x 모두 테스트 모듈과의 원활한 통합을 제공합니다. Spring은 Junit 및 TestNG 테스트 프레임워크를 지원하며 웹 프레임워크 테스트와 같은 몇 가지 추가 Spring 기반 테스트 기능도 제공합니다. HTTP 요청의 기능을 시뮬레이션합니다.
10. 봄이 우리에게 어떤 도움을 줄 수 있을까요?
Spring은 구성 파일을 기반으로 객체 간의 종속성을 생성하고 조합하는 데 도움이 될 수 있습니다.
Spring은 구성 파일을 기반으로 개체 간의 종속성을 생성하고 조합하기만 하면 됩니다.
Spring 관점 지향 프로그래밍을 사용하면 결합 없이 로깅, 성능 통계 및 보안 제어를 구현할 수 있습니다.
Spring 측면 지향 프로그래밍은 일반적으로 구성을 통해 이를 완료하는 더 나은 방법을 제공할 수 있으며 기존 코드에 추가 코드를 추가할 필요가 없습니다. 기존 코드는 비즈니스 로직에 중점을 둡니다.
Spring을 사용하면 데이터베이스 트랜잭션을 매우 쉽게 관리할 수 있습니다.
Spring을 사용하면 연결을 얻고 SQL을 실행하기만 하면 되고, 기타 관련된 사항은 Spring에서 관리합니다.
Spring은 또한 타사 데이터베이스 액세스 프레임워크(예: Hibernate, JPA)와 완벽하게 통합될 수 있으며 데이터베이스 액세스를 용이하게 하는 JDBC 액세스 템플릿 세트도 제공합니다.
Spring은 타사 웹(예: Struts, JSF) 프레임워크와도 원활하게 통합될 수 있으며 웹 계층 구성을 용이하게 하기 위해 SpringMVC 프레임워크 세트도 제공합니다.
Spring은 JavaEE(예: JavaMail, 작업 예약) 및 기타 기술(예: 캐싱 프레임워크)과 쉽게 통합될 수 있습니다.
11. 봄의 일을 설명해 주세요.
선언적 트랜잭션 관리 정의: 코드 처리 트랜잭션 대신 Spring 구성 파일에서 선언적 트랜잭션 처리를 사용합니다. 이것의 장점은 트랜잭션 관리가 개발된 구성요소를 침해하지 않는다는 것입니다. 특히 비즈니스 로직 객체는 트랜잭션에 의해 관리되고 있다는 사실을 인식하지 못합니다. 트랜잭션 관리는 서비스이기 때문입니다. 비즈니스가 아닌 시스템 수준에서 트랜잭션 관리 계획을 변경하려는 경우 정의 파일에서만 재구성하면 되며 이는 유지 관리가 매우 편리합니다.
TransactionInterceptor를 기반으로 한 선언적 트랜잭션 관리: 두 개의 보조 속성: 트랜잭션 관리자를 지정하고 특정 트랜잭션 관련 작업을 위임하는 데 사용되는 transactionManager, 다른 하나는 Properties 유형의 transactionAttributes 속성입니다. 값 쌍에서 키는 메소드 이름을 지정하고, 메소드 이름은 와일드카드를 사용할 수 있으며, 값은 해당 메소드에서 사용하는 트랜잭션 속성을 나타냅니다.
<beans> ...... <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="transfer">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="bankServiceTarget" class="footmark.spring.core.tx.declare.origin.BankServiceImpl"> <property name="bankDao" ref="bankDao"/> </bean> <bean id="bankService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="bankServiceTarget"/> <property name="interceptorNames"> <list> <idref bean="transactionInterceptor"/> </list> </property> </bean> </beans>
TransactionProxyFactoryBean을 기반으로 한 선언적 트랜잭션 관리: 구성 파일 설정이 이전보다 훨씬 간단해졌습니다. 우리는 이러한 유형의 설정 구성 파일 형식을 Spring의 고전적인 선언적 트랜잭션 관리라고 부릅니다.
<beans> ...... <bean id="bankServiceTarget" class="footmark.spring.core.tx.declare.classic.BankServiceImpl"> <property name="bankDao" ref="bankDao"/> </bean> <bean id="bankService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="target" ref="bankServiceTarget"/> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="transfer">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>
네임스페이스 기반의 선언적 트랜잭션 관리: 처음 두 가지 방법인 Spring 2를 기반으로 합니다.
<beans> ...... <bean id="bankService" class="footmark.spring.core.tx.declare.namespace.BankServiceImpl"> <property name="bankDao" ref="bankDao"/> </bean> <tx:advice id="bankAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="transfer" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/> <aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/> </aop:config> ...... </beans>
@Transactional을 기반으로 한 선언적 트랜잭션 관리: Spring 2.x에는 @Transactional 주석을 주로 포함하는 Annotation 기반 접근 방식도 도입되었습니다. @Transactional은 인터페이스, 인터페이스 메소드, 클래스 및 클래스 메소드에 적용될 수 있습니다. 계산이 클래스에 적용되면 클래스의 모든 공용 메소드는 해당 유형의 트랜잭션 속성을 갖게 됩니다.
@Transactional(propagation = Propagation.REQUIRED) public boolean transfer(Long fromId, Long toId, double amount) { return bankDao.transfer(fromId, toId, amount); }
프로그램적 트랜잭션 관리의 정의: 코드에서 beginTransaction(), commit(), Rollback() 및 기타 트랜잭션 관리 관련 메서드를 명시적으로 호출하는 것이 프로그램적 트랜잭션 관리입니다. Spring의 프로그래밍 방식의 사물 관리에는 기본 API를 기반으로 한 프로그래밍 방식 관리와 TransactionTemplate을 기반으로 한 프로그래밍 방식의 트랜잭션 관리라는 두 가지 방법이 있습니다.
기본 API를 기반으로 한 프로그래밍 방식 관리: Credentials PlatformTransactionManager, TransactionDefinition 및 TransactionStatus 세 가지 핵심 인터페이스를 통해 프로그래밍 방식 트랜잭션 관리를 구현합니다.
public class BankServiceImpl implements BankService { private BanckDao bankDao; private TransactionDefinition txDefinition; private PlatformTransactionManager txManager; public boolean transfer(Long fromId, Long toId, double amount) { TransactionStatus txStatus = txManager.getTransaction(txDefinition); boolean result = false; try { result = bankDao.transfer(fromId, toId, amount); txManager.commit(txStatus); } catch (Exception e) { result = false; txManager.rollback(txStatus); System.out.println("Transfer Error!"); } return result; } }
TransactionTemplate을 기반으로 한 프로그래밍 방식의 트랜잭션 관리: 코드의 원래 구성을 손상시키지 않고 모든 메소드에 시작, 제출 및 롤백에 대해 동일한 상용구 코드가 포함되는 현상을 피하기 위해 Spring은 transactionTemplate 템플릿을 제공합니다. 프로그래밍 방식의 트랜잭션 관리를 구현합니다.
public class BankServiceImpl implements BankService { private BankDao bankDao; private TransactionTemplate transactionTemplate; public boolean transfer(final Long fromId, final Long toId, final double amount) { return (Boolean) transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { Object result; try { result = bankDao.transfer(fromId, toId, amount); } catch (Exception e) { status.setRollbackOnly(); result = false; System.out.println("Transfer Error!"); } return result; } }); } }
프로그래밍 트랜잭션과 선언적 트랜잭션의 차이점:
프로그래밍 트랜잭션은 트랜잭션 처리 클래스를 직접 작성한 다음 호출하는 것입니다.
선언적 트랜잭션은 구성 파일에 구성되며 일반적으로 프레임워크에서 사용됩니다.
위 내용은 최신 Java 인터뷰 질문: Spring 프레임워크 부분의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!