appfuse 학습 노트 (5) 시스템 시작 분석

1. 웹. xml 의 설정
Spring 프로필 및 applicationContext 모니터 설정

……
<!-- Context Configuration locations for Spring XML files -->
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/applicationContext-resources.xml
            classpath:/applicationContext-dao.xml
            classpath:/applicationContext-service.xml
            classpath*:/applicationContext.xml
            /WEB-INF/applicationContext*.xml
            /WEB-INF/xfire-servlet.xml
            /WEB-INF/security.xml
        </param-value>
</context-param>
……
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
   <listener-class>com.mycompany.app.webapp.listener.StartupListener</listener-class>
</listener>

2. ContextLoaderListener 애플 리 케 이 션 초기 화 Context
servlet 용기 가 시 작 될 때 모니터 ContextLoaderListener 가 ServletContextEvent 이 벤트 를 감청 하고 호출 합 니 다.
contextInitialized 방법
org.springframework.web.context.ContextLoaderListener

private ContextLoader contextLoader;
public void contextInitialized(ServletContextEvent event) {
		this.contextLoader = createContextLoader();
		//   WebApplicationContext
	this.contextLoader.initWebApplicationContext(event.getServletContext());
	}

contextInitialized 방법 에서 contextLoader 를 호출 했 습 니 다.
initWebapplicationContext (event. getServletContext () 방법
contextLoader 가 어떻게 초기 화 하 는 지 살 펴 보 겠 습 니 다.
org.springframework.web.context.ContextLoader

private WebApplicationContext context;
public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
			throws IllegalStateException, BeansException {
……
		servletContext.log("Initializing Spring root WebApplicationContext");
……		
try {
		……
			this.context = createWebApplicationContext(servletContext, parent);
……
		return this.context;
		}
		……
	}

tomcat 를 시작 할 때 콘 솔 에서 출력 한
"정보: Spring root WebApplication Context 초기 화"
이 때 출력
initWebApplication Context 방법 에서 통과
createWebApplicationContext(servletContext, parent)
방법 은 웹 응용 프로그램 Context context 대상 을 만 들 었 습 니 다.
웹 애플 리 케 이 션 Context 를 만 드 는 방법 을 다시 봅 니 다.
org.springframework.web.context.ContextLoader

public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";
protected WebApplicationContext createWebApplicationContext(
			ServletContext servletContext, ApplicationContext parent) throws BeansException {
		//  serlcetContext web.xml      contextClass,          contextClass
Class contextClass = determineContextClass(servletContext);
		if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
			throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
					"] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]");
		}
		ConfigurableWebApplicationContext wac =
				(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
	……	 
	//  serlcetContext web.xml   spring         
wac.setConfigLocation(servletContext.getInitParameter(CONFIG_LOCATION_PARAM));
		……
		return wac;
	}

어떻게 얻 는 지 contextClass
org.springframework.web.context.ContextLoader

private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties";
	private static final Properties defaultStrategies;
	static {
		// Load default strategy implementations from properties file.
		// This is currently strictly internal and not meant to be customized
		// by application developers.
		try {
			ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);
			defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
		}
		catch (IOException ex) {
			throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());
		}
	}
public static final String CONTEXT_CLASS_PARAM = "contextClass";
protected Class determineContextClass(ServletContext servletContext) throws  ApplicationContextException {
		//web.xml     contextClass,        
		String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);
		if (contextClassName != null) {
			try {
				return ClassUtils.forName(contextClassName);
			}
			catch (ClassNotFoundException ex) {
				throw new ApplicationContextException(
						"Failed to load custom context class [" + contextClassName + "]", ex);
			}
		}
		else {
			// contextClassName == null,         
			contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
			try {
				return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());
			}
			catch (ClassNotFoundException ex) {
				throw new ApplicationContextException(
						"Failed to load default context class [" + contextClassName + "]", ex);
			}
		}
	}

우선 웹. xml 에서 설정 항목 이 있 는 지 찾 습 니 다. 없 으 면 설정 파일 에서 설정 항목 을 읽 습 니 다.
원본 코드 에서 설정 파일 이 "ContextLoader. properties" 로 설정 되 어 있 음 을 볼 수 있 습 니 다.
읽 을 설정 항목 은 WebApplication Context. class. getName () 입 니 다.
org / springframework / web / context / ContextLoader. properties 를 찾 았 습 니 다.
# Default WebApplicationContext implementation class for ContextLoader.
# Used as fallback when no explicit context implementation has been specified as context-param.
# Not meant to be customized by application developers.
org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
그래서 결국 ContextLoader Listener 에서 저희 가 초기 화 한 것 은 XmlWebApplication Context 대상 입 니 다.
3. StartupListener 시작 시스템
servlet 용기 가 시 작 될 때 모니터 StartupListener 가 ServletContextEvent 이 벤트 를 감청 하고 호출 합 니 다.
contextInitialized 방법
com.mycompany.app.webapp.listener.StartupListener

public void contextInitialized(ServletContextEvent event) {
        log.debug("Initializing context...");
        ServletContext context = event.getServletContext();
		……
        setupContext(context);
}
public static void setupContext(ServletContext context) {
        ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
        LookupManager mgr = (LookupManager) ctx.getBean("lookupManager");
        // get list of possible roles
        context.setAttribute(Constants.AVAILABLE_ROLES, mgr.getAllRoles());
        log.debug("Drop-down initialization complete [OK]");
}

다음은 spring 설정 을 살 펴 보 겠 습 니 다.
applicationContext - service. xml 에 bean "lookupManager" 를 설정 하 였 습 니 다.

<bean id="lookupManager" class="com.mycompany.app.service.impl.LookupManagerImpl">
        <property name="lookupDao" ref="lookupDao"/>
</bean>

applicationContext - dao. xml 에 bean "lookupDao" 를 설정 하 였 습 니 다.

<bean id="lookupDao" class="com.mycompany.app.dao.hibernate.LookupDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
</bean>

마찬가지 로 applicationContext - dao. xml 에 bean "session Factory" 를 설정 하 였 습 니 다.

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=${hibernate.dialect}
                hibernate.query.substitutions=true 'Y', false 'N'
                hibernate.cache.use_second_level_cache=true
                hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
            </value>
            <!-- Turn batching off for better error messages under PostgreSQL -->
            <!-- hibernate.jdbc.batch_size=0 -->
        </property>
</bean>

여기에 hibenate 설정 파일 과 관련 속성 설정 을 지정 하 였 습 니 다.

hibernate.dialect=${hibernate.dialect}

hibernate.query.substitutions=true 'Y', false 'N'

hibernate.cache.use_second_level_cache=true

    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
그리고 applicationContext - resources. xml 에 bean "dataSource" 를 설정 하 였 습 니 다.

<bean id="dataSource" 
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="100"/>
        <property name="maxWait" value="1000"/>
        <property name="poolPreparedStatements" value="true"/>
        <property name="defaultAutoCommit" value="true"/>
</bean>

apache dbcp 를 사용 하여 데이터베이스 연결 풀 을 만 들 었 습 니 다.
프로필 은 먼저 여 기 를 보고 고 개 를 돌려 보 세 요.
com.mycompany.app.webapp.listener.StartupListener

public static void setupContext(ServletContext context) {
        ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
        LookupManager mgr = (LookupManager) ctx.getBean("lookupManager");
        // get list of possible roles
        context.setAttribute(Constants.AVAILABLE_ROLES, mgr.getAllRoles());
        log.debug("Drop-down initialization complete [OK]");
}

방문 시 사용 할 수 있 도록 모든 역할 을 얻 었 습 니 다.

좋은 웹페이지 즐겨찾기