Java Webアプリケーションのセルフ・アーキテクチャの一元化構成


気まずいですね.自分が技術博文を書いたことに気づきました.もう1年前のことです.娯楽に時間を浪費したようです.いいえ、仕事はまじめです.余暇は、ちょっともったいないですが、すばらしいことを研究して分かち合ったことがあります.おしゃべりをしないで、これで分かち合います.
       
この間、新型のいくつかの主流のJavaフレームワークについて研究を続けてきましたが、今ではWebアプリケーションのモデルで筆者の心得を課題化し、一つ一つ共有しています.今日は第1編で、筆者の小型Webプログラムに対するアーキテクチャと、元のwebをどのようにするかを分かち合います.xmlとspringのアプリケーションContext.xmlは、新しい注釈化された構成クラスに対応します.
       
以前『Spring 3.1のweb.xml式のコード構成に基づくservlet 3.0アプリケーションを究める』では、Springがサーブレット3のサーブレットContainerInitializerをどのように利用してWeb初期化構成を行っているのかが知られていたが、ここで筆者は自分で書くのではなく、SpringのFileCopyUtilsを利用するように、それがどのように実現されているのかを明らかにし、使うときに直接持ってくる.便利です.
アーキテクチャを図に示します.srcパッケージでは、3階層化
1,制御層ctrl,MVCのCは,表層,UIとのデータスケジューリング,Httpリクエストを受信して対応する応答を行うことが知られているが,ここでは具体的にどのフレームワークを用いるかは不明であり,先に置いておく.
2,ビジネス層hub,biz,business,serviceともよい,すなわちビジネスロジック層,webコアスケジューリング層全体である.
3外部層pinは、通常daoデータアクセス層であり、ここではデータベースを借りて外部補助システムとしてだけでなく、外部の他のシステムとこの層に置くべきであり、外部システムとのコミュニケーションの下層として使用されるため、イメージ的なピンという言葉が使われている.
 
外部システムとは、メールサーバ、ウェブサービス呼び出し、呼び出されるなど、ファイルリソースである可能性もあります.例えば、ファイルリソースが必ずしも配備されたサーバに格納されるとは限らない場合があり、amazonのS 3のような他の専門的なサーバにアウトソーシングされる可能性もある.この場合、ビジネス層hubは、ファイルリソースの格納がどのような戦略であるかを知る必要がなく、下位層の方法を直接呼び出し、pin層の専門的なファイルリソース格納を管理するクラスによって具体的な操作を行う.さらに次のpersistenceに伝統的なdaoサービスをします.
もちろんentityは、ビジネスエンティティモデルであることを忘れないでください.
Utilには、コンフィギュレーションやツールなどのクラスが入っています.例えば図中で選択するハイライトファイルは、従来のウェブに対応する.xmlのファイルは、ここでWebConfigurationと名付けられています.もちろん、名前は人によって異なります.
テストパッケージtestsrcは、後述するユニットテストのセクションで具体的に説明します.ここで終わります.
そして使用するライブラリは、JREはもちろん、Web App Libは、必要なjarファイルをWebContent/WEB-INF/libの下に置いて自動的に生成します.
テストライブラリSpringJunit 4もテスト章です.後ろのランタイムライブラリはservletパッケージを作るために、servlet 3でサポートされているものを勝手に追加すればいいです.
WebContentの下の内容は、後で導入する環境のすべての内容であり、筆者はsysParamsを置いている.propertiesはシステムのいくつかの構成属性であり、デプロイメント担当者がwebデプロイメントを行う場合は、これを変更するだけでよい.開発中に構成可能なオプションは、静的なPropertiesクラスオブジェクトを介して対応する名前値ペアを見つけ、一定の方法で必要なタイプに変換する必要があります.どのように実現するかについては、これから見てみましょう.
まず、元のwebに対応しています.xmlのWebConfigurationコードは次のとおりです.
 
package com.gxino.webmodel.util;

import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

public class WebConfiguration implements WebApplicationInitializer{

	private static Properties sysParams=new Properties();
	
	public static Properties getSysParams() {
		return sysParams;
	}

	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		try {
			String sysParamsLocation=this.getClass().getResource("/").getFile().replace("/classes/", "/sysParams.properties");
			sysParams.load(new FileReader(sysParamsLocation));
		} catch (IOException e) {
		}
		AnnotationConfigWebApplicationContext annoAppCtx 
			= new AnnotationConfigWebApplicationContext();
		annoAppCtx.register(ApplicationContext.class);
		if(servletContext!=null)servletContext.addListener(new ContextLoaderListener(annoAppCtx));
	}

}
 
 
SpringのWebApplicationInitializerを実装した後にメソッドonStartup(servletContenxt)を書きました.servlet 3をサポートするサーバが起動すると、WebApplicationInitializerのすべての実装クラスが見つかり、onStartupメソッドが実行されるので、その方法については、冒頭で説明しました.別のブログを読んでください.この方法で筆者が最初にやったのはload sysParamsである.propertyiesファイルは、このクラスの静的Properties変数sysParamsに格納されます.これにより、どのコードもこのsysParamsに直接getできます.次の2つのコードは
       
WebApplicationCotext、もちろんSpringのもので、意味がはっきりしていて、注釈配置化されたWebApplication環境、この環境の配置はどこですか?ApplicationContextです.class、上の環境に登録します.最後の文servletContext.addListenerは、従来の構成
 
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 
 
Springを起動します.もちろんservletContextはアプリケーションで、add servlet、listener、filter、servlet param、つまり、どんなwebでもできます.xmlの構成.しかし、実際にこれらのクラスを書くときは、WebApplicationInitializerを直接実現し、onStartupメソッドを書いておけばいいのですが、同じようにサーバの起動時に実行されるので、これについては、これまでのブログなしでも説明していました.
     
次に、上記の構成クラスApplicationContextに注目する.class、筆者はそれをこのように命名した.それが従来のアプリケーションContextであることを示すためだ.xml.
 
package com.gxino.webmodel.util;

import java.util.Properties;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate3.HibernateInterceptor;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;

import com.gxino.webmodel.entity.AccountEntity;
import com.gxino.webmodel.entity.ActionLogEntity;

@Configuration
@ComponentScan("com.xxxx.webmodel")
public class ApplicationContext {
	private SessionFactory sessionFactory;
	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	@Resource
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Bean(destroyMethod = "close")
	public DataSource dbcpDataSource() {

		Properties parameters = WebConfiguration.getSysParams();
		BasicDataSource basicDS = new BasicDataSource();
		basicDS.setDriverClassName(parameters.getProperty("jdbc.driver",
				"oracle.jdbc.OracleDriver"));
		basicDS.setUrl(parameters.getProperty("jdbc.url",
				"jdbc:oracle:thin:@localhost:1521:xe"));
		basicDS.setUsername(parameters.getProperty("jdbc.username", "system"));
		basicDS.setPassword(parameters.getProperty("jdbc.password",
				"oraclesystem"));
		basicDS.setMaxIdle(1000);

		basicDS.setMinIdle(4);
		basicDS.setMaxActive(8);
		basicDS.setInitialSize(3);
		basicDS.setMaxWait(10000);
		return basicDS;
	}

	@Configuration
	static class SessionFactoryConfig {
		@Resource
		private DataSource ds;

		public DataSource getDs() {
			return ds;
		}

		public void setDs(DataSource ds) {
			this.ds = ds;
		}

		@Bean
		public LocalSessionFactoryBean sessionFactory() {

			LocalSessionFactoryBean asfBean = new LocalSessionFactoryBean();
			asfBean.setDataSource(this.getDs());
			Properties parameters = WebConfiguration.getSysParams();
			Properties prop = new Properties();
			prop.setProperty("hibernate.dialect", parameters.getProperty(
					"hibernate.dialect", "org.hibernate.dialect.OracleDialect"));
			prop.setProperty("hibernate.connection.autocommit", parameters
					.getProperty("hibernate.connection.autocommit", "false"));
			prop.setProperty("hibernate.show_sql",
					parameters.getProperty("hibernate.show_sql", "true"));
			prop.setProperty("hibernate.hbm2ddl.auto",
					parameters.getProperty("hibernate.hbm2ddl.auto", "update"));
			asfBean.setHibernateProperties(prop);

			@SuppressWarnings("rawtypes")
			Class[] entities = new Class[2];
			entities[0] = AccountEntity.class;
			entities[1] = ActionLogEntity.class;
			asfBean.setAnnotatedClasses(entities);
			return asfBean;
		}
	}

	@Bean
	public HibernateTransactionManager hibernateTransactionManager() {
		HibernateTransactionManager hiberTransMana = new HibernateTransactionManager();
		hiberTransMana.setSessionFactory(this.getSessionFactory());
		return hiberTransMana;
	}

	@Bean
	public HibernateInterceptor hibernateInterceptor() {
		HibernateInterceptor hiberInter = new HibernateInterceptor();
		hiberInter.setSessionFactory(this.getSessionFactory());
		return hiberInter;
	}

	@Bean
	public HibernateTemplate hibernateTemplate() {
		HibernateTemplate hiberTempl = new HibernateTemplate();
		hiberTempl.setSessionFactory(this.getSessionFactory());
		return hiberTempl;
	}

}
 
 
はい、このApplicationContextのコードを少しずつ理解します.
       
まず、アプリケーションContex.xmlはに包まれた様々なであり、ここで@Configuration注釈の1つであるclass ApplicationContextは全体的にと見なすことができるが、実は@Configuration自体がbeanであり、そのコードを見てみると@Component注釈されていることがわかり、beanを構成していることが理解できる.その後、このApplicationContextには@Beanに注釈される方法がたくさんあります.この構成beanで構成されたBeanは、プログラム注入のために使用されます.これらのメソッドの戻り値はbeanのclassタイプであり、メソッド名はbeanのname、すなわちxmlで構成された