appfuse 학습 노트 (5) 시스템 시작 분석
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]");
}
방문 시 사용 할 수 있 도록 모든 역할 을 얻 었 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.