ApplicationContextAware获取Spring上下文,通过基类获取properties中的配置属性


说明: 该方法实现了,通过继承JAR包中基类来获取properties中配置的相关属性,并添加至spring容器中,供代码中使用。


1。 基类

package com.ffcs.icity.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;


/**
 * 此类用于存放框架相关的配置.
 *
 * 
 */
public abstract class BaseApplicationConfig implements InitializingBean {

	@Value("${log.isDumpRequest:false}")
	@FieldDescription("是否dump请求")
	private boolean isDumpRequest = false;

	@Value("${log.logger.root.level:DEBUG}")
	@FieldDescription("日志级别等级")
	private String logLevel = "DEBUG";

	public boolean isDumpRequest() {
		return isDumpRequest;
	}
	
	public String getLogLevel() {
		return logLevel;
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
	}

	@Target({ ElementType.FIELD })
	@Retention(RetentionPolicy.RUNTIME)
	public @interface FieldDescription {
		String value();
	}

	@Override
	public void afterPropertiesSet() throws Exception {
//		this.originalApplicationConfig = BeanUtils.copyObject(this, "originalApplicationConfig");
	
	}

}

2。 配置文件内容

#log level
log.logger.root.level=DEBUG

#log open flag
log.isDumpRequest=true

3。 实现ApplicationContextAware接口,获取spring上下文相关类

package com.ffcs.icity.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


/**
 * BaseApplicationConfig实例的获取
 * @author linwei
 *
 */
public class ApplicationConfigHolder implements ApplicationContextAware {

	private final static Logger logger = LoggerFactory.getLogger(ApplicationConfigHolder.class);
	
	private static BaseApplicationConfig applicationConfig;
	
	public static  T getApplicationConfig() {
		return (T)applicationConfig;
	}
	
	/**
	 * 通过实现ApplicationContextAware接口,获取Spring的实例上下文,并获取BaseApplicationConfig实例
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

		//获取类型为BaseApplicationConfig的BEAN
		applicationConfig = applicationContext.getBean(BaseApplicationConfig.class);
		logger.info("loaded initial application config:{}", applicationConfig);
	}

}

package com.ffcs.icity.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


/**
 * Spring上下文的获取
 * @author linwei
 *
 */
public class ApplicationContextHolder implements ApplicationContextAware{

	private static ApplicationContext applicationContext;

	public static ApplicationContext getApplicationContext() {
		return ApplicationContextHolder.applicationContext;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		ApplicationContextHolder.applicationContext=applicationContext;		
	}
	
}

package com.ffcs.icity.config;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 此类保存当前请求的上下文信息.
 * 
 * 
 */
public class RequestContextHolder {

	/**
	 * 当前请求的请求对象
	 */
	private static ThreadLocal request = new ThreadLocal();

	/**
	 * 当前请求的请求对象
	 */
	private static ThreadLocal response = new ThreadLocal();

	/**
	 * 当前请求的请求参数
	 */
	private static ThreadLocal requestArgument = new ThreadLocal();
	
	/**
	 * 当前请求的请求ID
	 */
	private static ThreadLocal requestId = new ThreadLocal();

	public static HttpServletRequest getRequest() {
		return request.get();
	}

	public static void setRequest(HttpServletRequest request) {
		RequestContextHolder.request.set(request);
	}

	public static HttpServletResponse getResponse() {
		return response.get();
	}

	public static void setResponse(HttpServletResponse response) {
		RequestContextHolder.response.set(response);
	}

	public static Object getRequestArgument() {
		return requestArgument.get();
	}

	public static void setRequestArgument(Object requestArgument) {
		RequestContextHolder.requestArgument.set(requestArgument);
	}
	
	public static String getRequestId() {
		return requestId.get();
	}

	public static void setRequestId(String requestId) {
		RequestContextHolder.requestId.set(requestId);
	}

	public static void clear() {
		request.remove();
		response.remove();
		requestArgument.remove();
		requestId.remove();
	}

}
 
  
说明:以上工具类可以存放至JAR包中,供其他的项目导入使用。


4。 在spring的web项目中,新建一个类,继承基类,并在spring中注入相关BEAN,即可获取其相关的属性信息,如下:

package com.ffcs.icity.support;

import com.ffcs.icity.config.BaseApplicationConfig;

public class ApplicationConfig extends BaseApplicationConfig {

}

      spring的配置文件内容如下:





	
	
		
	

	

	

	

	
	
	
		
			
				
			
		
	

	
		
			
				
					
						
						
					
				
			
		
	

	
		

	



说明: 以上bean的设置请关闭延迟加载功能。即整个配置文件使用  default-lazy-init="false" 属性,或者在 
  bean中直接设置延迟加载关闭。


             或者另外一种方式,打开延迟加载功能,但在代码中需要自己手动进行注入,即使用@Autowired 实现自己的手动注入,实现该bean的初始化工作。

             因为延迟加载打开后,需要代码中手动注入才可以实现bean工厂的初始化。(延迟加载关闭,则在项目启动时,由web容器自动进行初始化加载。)


5.   代码直接调用例子:

      可直接新建方法:isDumpRequest() ,这样就获取到最新的配置文件中配置的值。如配置文件未配置,则使用基类中定义的默认值.

       private boolean isDumpRequest() {
return getApplicationConfig().isDumpRequest();
}


private BaseApplicationConfig getApplicationConfig() {
return ApplicationConfigHolder.getApplicationConfig();
}


       


































你可能感兴趣的:(Spring知识)