私はSpringFrameworkを初めて使用します。春の基本的な理解を教えてください。私はJavaとJSFを知っていますが、Strutsやその他のフレームワークについては何も知りません。インターネットを検索してPDFをダウンロードできましたが、JSFフローのようにSpringフローがわかりません。Springの流れを簡単に理解するためのリンクを教えてください。
3 に答える
- 移行1-ユーザーは、フォームを送信するか、ハイパーリンクをクリックするなどして、サーバーにリクエストを送信します。リクエストは最初にWEB.XMLに送信されます。
- 遷移2– WEB.XMLは、タグを確認することにより、要求をDispatcherServletにルーティングします。
- 移行3– DispatcherServlet内で、最初の「HandlerMapping」が適切な「Controller」にリクエストを渡しました。
- 移行4–コントローラーはリクエストを適切なモデルクラスにマップします。すべてのBUSINESSLOGICは、Modelクラス内で実行されます。
- 移行5–データベース操作が必要な場合、モデルクラスはリクエストを適切なDAOにルーティングします。すべてのデータベース操作はDAOで実行する必要があります。
- Transition6 –必要に応じて、属性をリクエスト/セッション/アプリケーションスコープにアタッチし、モデルに戻ります。
- 移行7–必要に応じて、属性をリクエスト/セッション/アプリケーションスコープにアタッチし、コントローラーに戻ります。
- 遷移8–コントローラーはそれを任意のビュー(JSP / HTMLなど)に返すだけです。
- 移行9– JSP/Htmlがユーザーに表示されます。
私もSpringFrameworkを初めて使用します。これまでのところ、以下のドキュメントが最も基本的なものです。私も読んでいます。お役に立てば幸いです。
私もSpringに不慣れで、昔も同じような質問がありました。まず最初に、CraigWallsによる「SpringinAction」の本をお勧めしたいと思います。これは非常に便利で理解しやすいものであり、 http: //www.tutorialspoint.com/spring/も多くのことを理解するのに役立ちました。あなたの質問を正しく理解していれば、「Springのフロー」をSpringIoCコンテナとSpringBeanのライフサイクルに分けることができます。これは、春の豆のライフサイクルの例を含む非常に小さな概要です。Beanは、Springコンテナでの作成と破棄の間にいくつかのステップを経ます。これらの手順は次のとおりです。
- インスタンス化
- プロパティを入力します
- BeanNameAwareのsetBeanName()
- BeanFactoryAwareのsetBeanFactory
- ApplicationContextAwareのsetApplicationContext()
- 初期化前のBeanPostProcessors
- InitializingBeanのafterPropertiesSet()
- カスタムinitメソッドを呼び出す
- 初期化後のBeanPostProcessors
- DisponsableBeanの破棄
- カスタムdestroy-methodを呼び出す
各ステップは、カスタマイズのための独自の機会を提供します。Beanの寿命を単純に「追跡」するコードを次に示します。
Bean ClassAの場合:
public class ClassA implements InitializingBean, DisposableBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware{
private String messageA;
public ClassA() {
System.out.println("ClassA: default constructor called.");
}
public void customInitMethod(){
System.out.println("ClassA: customInitMethod() method called.");
}
public void customDestroyMethod(){
System.out.println("ClassA: customDestroyMethod() method called.");
}
public String getMessageA() {
System.out.println("ClassA: message get method called.");
return messageA;
}
public void setMessageA(String message) {
System.out.println("ClassA: message set method called.");
this.messageA = message;
}
public void afterPropertiesSet() throws Exception {
System.out.println("ClassA: afterPropertiesSet() called because InitializingBean interface.");
}
public void destroy() throws Exception {
System.out.println("ClassA: destroy() called because DisposableBean interface.");
}
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
System.out.println("ClassA: application context set: " + arg0.getApplicationName());
}
public void setBeanFactory(BeanFactory arg0) throws BeansException {
System.out.println("ClassA: beanFacrory set.");
}
public void setBeanName(String arg0) {
System.out.println("ClassA: bean name set: " + arg0);
}
}public class ClassA implements InitializingBean, DisposableBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware{
private String messageA;
public ClassA() {
System.out.println("ClassA: default constructor called.");
}
public void customInitMethod(){
System.out.println("ClassA: customInitMethod() method called.");
}
public void customDestroyMethod(){
System.out.println("ClassA: customDestroyMethod() method called.");
}
public String getMessageA() {
System.out.println("ClassA: message get method called.");
return messageA;
}
public void setMessageA(String message) {
System.out.println("ClassA: message set method called.");
this.messageA = message;
}
public void afterPropertiesSet() throws Exception {
System.out.println("ClassA: afterPropertiesSet() called because InitializingBean interface.");
}
public void destroy() throws Exception {
System.out.println("ClassA: destroy() called because DisposableBean interface.");
}
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
System.out.println("ClassA: application context set: " + arg0.getApplicationName());
}
public void setBeanFactory(BeanFactory arg0) throws BeansException {
System.out.println("ClassA: beanFacrory set.");
}
public void setBeanName(String arg0) {
System.out.println("ClassA: bean name set: " + arg0);
}
}
CustomPostProcessorの場合:
public class CustomPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("CustomPostProcessor: beforeInitialization on: "
+ beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("CustomPostProcessor: afterInitialization on: "
+ beanName);
return bean;
}
}
メインクラスでは、ApplicationContextを作成し、Beanを取得して、メッセージを出力します。
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext(
"META_INF/spring/app-context.xml");
ClassA objA = (ClassA) context.getBean("classA");
System.out.println(objA.getMessageA());
context.registerShutdownHook();
}
app-context.xmlには、次のものがあります。
<bean id="classA" class="ClassA" init-method="customInitMethod"
destroy-method="customDestroyMethod">
<property name="messageA" value="messagA: Hello Spring!" />
</bean>
<bean class="CustomPostProcessor" />
私が理解しているように、出力ラインは次のようにライフサイクルステージに対応しています。
- 1.インスタンス化
ClassA:デフォルトのコンストラクターが呼び出されます。
- 2.人口のプロパティ
ClassA:呼び出されたメッセージセットメソッド。
- 3.BeanNameAwareのsetBeanName()
ClassA:Bean名セット:classA
- 4.BeanFactoryAwareのsetBeanFactory
ClassA:beanFacroryセット。
- 5.ApplicationContextAwareのsetApplicationContext()
ClassA:アプリケーションコンテキストセット:
- 6.初期化前のBeanPostProcessors
CustomPostProcessor:beforeInitialization on:classA
- 7.InitializingBeanのafterPropertiesSet()
ClassA:InitializingBeanインターフェイスのためにafterPropertiesSet()が呼び出されました。
- 8.カスタムinit-methodを呼び出す
ClassA:customInitMethod()メソッドが呼び出されました。
- 9.初期化後のBeanPostProcessors
CustomPostProcessor:afterInitialization on:classA
- プログラムはメッセージを出力します
ClassA:メッセージgetメソッドが呼び出されました。messagA:こんにちは春!
- 10.DisponsableBeanの破棄
ClassA:DisposableBeanインターフェイスのためにdestroy()が呼び出されました。
- 11.カスタムdestroy-methodを呼び出す
ClassA:customDestroyMethod()メソッドが呼び出されました。