1. SpringMVC はどのように機能しますか?
ユーザーがサーバーにリクエストを送信すると、リクエストは springMVC フロントエンド コントローラー DispatchServlet によってキャプチャされます。
DispatcherServle はリクエスト URL を解析し、リクエスト リソース識別子 ( URL) を呼び出し、URL に基づいて HandlerMapping を呼び出し、リクエストをプロセッサ HandlerExcutionChain にマッピングします。
DispatchServlet は、取得したハンドラーに基づいて処理に適した HandlerAdapter アダプターを選択します。
ハンドラーの完了後データ処理を行うと、ModelAndView オブジェクトが DisPatchServlet に返されます。
Handler によって返された ModelAndView は単なる論理ビューであり、正式なビューではありません。DispatcherSevlet は ViewResolver を使用して、論理ビューを実際のビューに変換しようとします。 ;
DispatcherServle はモデルを通じて ModelAndView() を解析します パラメータが解析され、最終的に完全なビューが表示されてクライアントに返されます;
2. SpringMVC の一般的なアノテーションは何ですか?
@RequestMapping は、URL マッピングをリクエストするために使用されます。
@RequestBody アノテーションは、http リクエストの json データを受け取り、json データを Java オブジェクトに変換する処理を実装します。
@ResponseBody アノテーションは、コントローラー メソッドによって返されたオブジェクトを顧客への JSON 応答に変換することを実装します。
3. 注釈プロセッサとアダプターを有効にするにはどうすればよいですか?
私たちのプロジェクトでは、通常、springmvc.xml でアノテーション プロセッサとアダプターをオンにして、アノテーション プロセッサとアダプターをオンにします。
4. 取得や投稿が文字化けする問題を解決するにはどうすればよいですか?
投稿リクエストの文字化けを解決するには: web.xml で CharacterEncodingFilter フィルターを構成できます。 utf-8 に設定する get リクエストのコード化けを解決するには、次の 2 つの方法があります。 get リクエストの中国語パラメータの文字化けに対する解決策は 2 つあります。
Tomcat 設定ファイルを変更して、エンジニアリング エンコーディングと一致するエンコーディングを追加します。
パラメータを再エンコードする別の方法 String userName = new String(request.getParameter("userName").getBytes("ISO8859-1"), "utf-8");
#5. Spring についての理解について話してください?
Spring は、エンタープライズ レベルのアプリケーション開発を簡素化するために作成されたオープン ソース フレームワークです。 Spring では、これまで EJB のみが実現できた機能を単純な JavaBeans で実現できます。 Spring は IOC および AOP コンテナ フレームワークです。Spring コンテナのメイン コアは:
Inversion of Control (IOC) 従来の Java 開発モデルでは、オブジェクトが必要な場合に、 new 自身または getInstance などは、コンストラクターを直接的または間接的に呼び出してオブジェクトを作成します。 Spring 開発モデルでは、Spring コンテナがファクトリ モデルを使用して必要なオブジェクトを作成します。自分でオブジェクトを作成する必要はありません。Spring が提供するオブジェクトを直接呼び出すことができます。これが反転の考え方です。コントロールの。 依存性注入 (DI) では、Spring は JavaBean オブジェクトの set メソッド、またはパラメーターを含むコンストラクター メソッドを使用して、必要なオブジェクトの作成時にそのプロパティを必要な値に自動的に設定します。依存性注入のアイデア。 アスペクト指向プログラミング (AOP) は、オブジェクト指向プログラミング (oop) の考え方で、物事を 1 つずつ垂直方向にオブジェクトに抽出します。アスペクト指向プログラミングでは、各オブジェクトの特定の類似した側面を水平方向に抽出してアスペクトにし、このアスペクトに対して権限制御、トランザクション管理、ロギングなどのいくつかの共通操作を実行します。これがアスペクト指向の考え方です。プログラミングです。 AOP の最下層はダイナミック プロキシです。インターフェイスが JDK ダイナミック プロキシを使用する場合、クラスが CGLIB を使用してダイナミック プロキシを実装する場合6. Spring のデザイン パターンは何ですか?
シングル ケース モード - Spring の 2 つのプロキシ メソッドターゲット オブジェクトが複数のインターフェイスを実装する場合、Spring は jdk の java.lang.reflect.Proxy クラス プロキシを使用します。ターゲット実装がインターフェイスを実装していない場合、Spring は CGLIB ライブラリを使用してターゲット クラスのサブクラスを生成します。シングルトン モード - Spring 構成ファイルで Bean をデフォルトのシングルトン モードに設定します。 テンプレート モード モード - コードの重複の問題を解決するために使用されます。例: RestTemplate、JmsTemplate、JpaTemplateフロントエンド コントローラー モード - Spring はリクエストを分散するためのフロントエンド コントローラー DispatherServlet を提供します。 ビュー ヘルパー (viewhelper) - Spring は、散在するコードをビューに統合するのに役立つ一連の JSP タグと効率的なマクロを提供します。 依存性注入 - BeanFactory/ApplacationContext インターフェースを通じて実行される中心的な概念。 ファクトリ パターン - ファクトリ パターンでは、オブジェクトの作成時に作成ロジックをクライアントに公開せず、同じインターフェイスを使用して新しく作成されたオブジェクトを指します。 BeanFactory は Spring でオブジェクトのインスタンスを作成するために使用されます。7. Spring でよく使用されるアノテーションは何ですか?
Spring は、バージョン 2.5 以降、依存関係注入を構成するためのアノテーションのサポートを開始しました。アノテーションを使用して、XML 内の Bean の説明を置き換えることができます。アノテーションのインジェクションは XML インジェクションの前にコンテナによって処理されるため、後者は同じ属性に対する前者の処理結果を上書きします。注釈アセンブリは、春にはデフォルトでオフになります。したがって、アノテーションベースのアセンブリモードを使用するには、スプリングコア構成ファイルで構成する必要があります。設定方法は以下のとおりです。
よく使用されるアノテーション:
@必須: このアノテーションは値の設定方法に適用されます。
@Autowired: このアノテーションは、値のセッター メソッド、非セッター メソッド、コンストラクター、および変数に適用されます。
@修飾子: このアノテーションは、特定の Bean の自動アセンブリを明確にするために @Autowired と組み合わせて使用されます。
8. Spring Bean のライフサイクルを簡単に紹介します?
Bean 定義: 構成ファイルでの定義に使用されます。
Bean の初期化: 初期化には 2 つの方法があります。これは、構成ファイルで init-method 属性を指定することによって行われます。 org.springframework.beans.factory.InitializingBean インターフェースを実装します。
Bean 呼び出し: Bean インスタンスを取得して呼び出すには 3 つの方法があります
Bean 破棄: 破棄するには 2 つの方法があります: 設定ファイルで指定された destroy-method 属性を使用します。 org.springframework.bean.factory.DisposeableBean を実装します。
9. Spring の構造図は理解できましたか?
コア コンテナ: コア、Bean、コンテキスト、および EL モジュールを含みます。コア モジュール: リソース アクセス、型変換、およびいくつかの共通ツール クラスを含む、フレームワークの依存関係の最下位レベルの部分をカプセル化します。
Beans モジュール: 制御の反転や依存関係の注入など、フレームワークの基本部分を提供します。このうち、BeanFactory はコンテナの中核であり、本質的には「ファクトリ デザイン パターン」の実装であり、「シングル ケース デザイン パターン」の実装にプログラミングは必要ありません。シングル ケースはコンテナによって完全に制御され、インターフェイスを提唱します実装指向のプログラミングではなく、実装指向のプログラミング、すべてのアプリケーション オブジェクト、およびオブジェクト間の関係は、プログラム ロジックから維持されるオブジェクト間の依存関係を真に抽出するフレームワークによって管理され、これらの依存関係はすべて BeanFactory によって維持されます。
Context モジュール: Core と Beans に基づいて、Beans モジュールの機能を統合し、リソース バインディング、データ検証、国際化、JavaEE サポート、コンテナ ライフ サイクル、イベント伝播などを追加します。コア インターフェイスは ApplicationContext です。
EL モジュール: 強力な式言語サポートを提供し、属性値、メソッド呼び出しへのアクセスと変更をサポート、配列、コンテナーとインデクサー、名前付き変数へのアクセスと変更をサポート、算術演算と論理演算をサポートし、Spring からの実行をサポートします。コンテナは Bean を取得します。この Bean は、リストの射影、選択、および一般的なリストの集約もサポートします。
AOP、Aspects モジュール: AOP モジュール: Spring AOP モジュールは、AOPAlliance 仕様に準拠したアスペクト指向プログラミング (アスペクト指向プログラミング) の実装を提供し、ロギング、権限制御、パフォーマンス統計などの共通機能を提供します。 . およびビジネス ロジック分離テクノロジを利用し、これらの関数を必要なコードに動的に追加できます。これにより、それぞれが独自の役割に専念し、ビジネス ロジックと一般的な関数の結合が軽減されます。
Aspects モジュール: AspectJ の統合を提供します。AspectJ は SpringASP よりも強力な機能を提供します。データ アクセス/統合モジュール: このモジュールには、JDBC、ORM、OXM、JMS、およびトランザクション管理が含まれます。
Transaction モジュール: このモジュールは Spring 管理トランザクションに使用されます。Spring がオブジェクトを管理する限り、Spring 管理トランザクションの利点を享受できます。コード内でトランザクションを制御する必要はなく、プログラミングをサポートします。そして宣言型トランザクション管理。
JDBC モジュール: JBDC サンプル テンプレートを提供します。これらのテンプレートを使用すると、従来の長い JDBC コーディングと必要なトランザクション制御が不要になり、Spring のトランザクション管理の利点を享受できます。
ORM モジュール: Hibernate、JPA、MyBatis などの一般的な「オブジェクト リレーショナル」マッピング フレームワークとのシームレスな統合を提供します。また、追加のトランザクション制御なしで Spring トランザクション管理を使用できます。
OXM モジュール: Java オブジェクトを XML データにマッピングする、または XML データを Java オブジェクトにマッピングする、オブジェクト/XML マッピング実装を提供します。オブジェクト/XML マッピング実装には、JAXB、Castor、XMLBeans、および XStream が含まれます。
JMS モジュール: JMS (JavaMessagingService) に使用され、JMS を簡単に使用するための「メッセージ プロデューサ、メッセージ コンシューマ」テンプレートのセットを提供します。JMS は 2 つのアプリケーション間で使用されます。または、非同期通信のために分散システムでメッセージを送信します。 。 Web/リモート モジュール: Web/リモート モジュールには、Web、Web-Servlet、Web-Struts、および Web-Porlet モジュールが含まれます。
Web モジュール: 基本的な Web 機能を提供します。たとえば、複数のファイルのアップロード、統合された IoC コンテナ、リモート プロセス アクセス (RMI、ヘシアン、バーラップ)、WebService サポート、および便利な Restfulservices アクセスを提供する RestTemplate クラスが提供されています。
Web-Servlet モジュール: SpringMVCWeb フレームワーク実装を提供します。 SpringMVC フレームワークは、アノテーション ベースのリクエスト リソース インジェクション、よりシンプルなデータ バインディング、データ検証など、および他の Spring テクノロジと完全にシームレスに連携する非常に使いやすい JSP タグのセットを提供します。
Web-Struts モジュール: Struts とのシームレスな統合を提供します。Struts1.x と Struts2.x の両方が Test モジュールをサポートします: Spring は Junit および TestNG テスト フレームワークをサポートし、Spring に基づいた追加のテスト機能も提供します。 Web フレームワークをテストするときに HTTP リクエストの機能をシミュレートするなど。
#10. Spring は何をしてくれるのでしょうか?
Spring は、構成ファイルに基づいてオブジェクト間の依存関係を作成および組み立てるのに役立ちます。
Spring は、構成ファイルに基づいてオブジェクト間の依存関係を作成およびアセンブルします。構成ファイルを変更するだけで済みます。
Spring のアスペクト指向プログラミングは、結合なしでロギングを実装するのに役立ちます。パフォーマンス統計、セキュリティ管理。
Spring アスペクト指向プログラミングは、通常は構成を通じてそれを完了するためのより良い方法を提供し、既存のコードにコードを追加する必要はありません。既存のコードはビジネス ロジックに重点を置いています。
Spring を使用すると、データベース トランザクションを非常に簡単に管理できます。
Spring を使用すると、接続を取得して SQL を実行するだけで済み、その他の関連する処理は Spring によって管理されます。
Spring は、サードパーティのデータベース アクセス フレームワーク (Hibernate、JPA など) とシームレスに統合することもでき、データベース アクセスを容易にする一連の JDBC アクセス テンプレートも提供します。
Spring は、サードパーティ Web (Struts、JSF など) フレームワークとシームレスに統合することもでき、Web 層の構築を容易にする一連の SpringMVC フレームワークも提供します。
Spring は、JavaEE (JavaMail、タスク スケジューリングなど) と簡単に統合でき、さらに多くのテクノロジ (キャッシュ フレームワークなど) と統合できます。
11. Spring のトランザクションについて説明してください。
宣言的トランザクション管理の定義: トランザクションを処理するコードの代わりに、Spring 構成ファイルで宣言的トランザクション処理を使用します。この利点は、トランザクション管理が開発されたコンポーネントに侵入しないことです。具体的には、ビジネス ロジック オブジェクトは、トランザクションによって管理されていることを認識しません。トランザクション管理はサービスであるため、実際にはそうあるべきです。ロジックの一部として、トランザクション管理計画を変更する場合は、定義ファイル内で再構成するだけで済み、保守が非常に便利です。
TransactionInterceptor に基づく宣言型トランザクション管理: 2 つの主な属性: トランザクション マネージャーを指定し、トランザクション マネージャーに特定のトランザクション関連の操作を委託するために使用されるtransactionManager、もう 1 つは各キー内の Properties タイプのtransactionAttributes 属性です。この属性の -value ペア。キーはメソッド名を指定します。メソッド名にはワイルドカードを使用できます。値は、対応するメソッドで使用されるトランザクション属性を表します。
<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>
名前空間に基づく宣言型トランザクション管理: 最初の 2 つの方法に基づいて、Spring 2.x では名前空間が導入され、名前空間を組み合わせて使用することで、開発者が宣言型トランザクションを構成できるようになります。
<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 アノテーションを使用するアノテーション ベースのアプローチも導入されています。 @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 に基づくプログラムによるトランザクション管理の 2 つの方法があります。
基盤となる API に基づくプログラム管理: Credentials PlatformTransactionManager、TransactionDefinition、TransactionStatus の 3 つのコア インターフェイスで、プログラムによるトランザクション管理を実装します。
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 中国語 Web サイトの他の関連記事を参照してください。