项目中ApplicationContext

applicationContext说白了就是对beanFactory的扩展,也就是一个spring容器,而且applicationContext是单例的,项目中主要包含一个webApplicationContext和spring的DispatchServlet的一个容器。

 

一.系统提供数据初始化即build的时候怎么把这些bean注入到spring容器中

   因为运行build,这不是一个web工程,不会解析web.xml,所以通过一个ApplicationContextFactory这个工厂类来启动一个spring容器:

  

public final class ApplicationContextFactory {
	private static ApplicationContextFactory instance;
	
	private Map<String,ApplicationContext> contexts=new HashMap<String,ApplicationContext>();
	
	private ApplicationContextFactory(){
		
	}
	
	public static ApplicationContextFactory getInstance(){
		if (instance==null){
			instance=new ApplicationContextFactory();
		}
		return instance;
	}
	
	public ApplicationContext getApplicationContext(){
		String type=System.getProperty("spring.profiles.active");
		ApplicationContext result=contexts.get(type);
		if (result==null){
			result=new ClassPathXmlApplicationContext(
					"classpath*:/applicationContext.xml");
			contexts.put(type, result);
		}
		return result;
	}
	
	public Object getBean(String beanName){
		return getApplicationContext().getBean(beanName);
	}
}

  注入各个applicationContext.xml的bean,然后在build中执行这些相关bean的init方法。

@Component
@AppInitRunner
public class SystemBuild extends InitializationsRunner {

	@Autowired
	private DatabaseInitManager databaseInitManager;
	@Autowired
	private SessionInitManager sessionInitManager;
	@Autowired
	private PropertiesInitManager propertiesInitManager;
	@Autowired
	private PermissionInitManager permissionInitManager;
	@Autowired
	private OrganizationInitManager organizationInitManager;
	
	@Autowired
	private RoleInitManager roleInitManager;
	@Autowired
	private JobInitManager jobInitManager;
	@Autowired
	private ProcessInitManager processInitManager;
	
	@Autowired
	private MemcachedClient memcachedClient;

	@Override
	public void executeInitialization() throws Exception {

		memcachedClient.flushAll();

		databaseInitManager.init();
		sessionInitManager.init();
		propertiesInitManager.init();
		permissionInitManager.init();
		organizationInitManager.init();
		roleInitManager.init();
		jobInitManager.init();
		processInitManager.init();
		
		memcachedClient.shutdown();
		System.exit(0);
	}

	public static void building(String[] args) {
		try {
			Map<String, Object> map = ApplicationContextFactory.getInstance()
					.getApplicationContext()
					.getBeansWithAnnotation(AppInitRunner.class);
			for (Entry<String, Object> entry : map.entrySet()) {
				((InitializationsRunner) entry.getValue())
						.executeInitialization();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

  

 

二.web工程加载ApplicationContext

  1.在web.xml中通过listener启动容器,这个webApplicationContext即rootContext,这里面主要是管理各个applicationContext.xml中注入的bean主要是一些工具类,DAO等

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext.xml
</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

  2.spring 本身的DispatchServlet就有一个容器,这个主要用来管理spring-mvc.xml中的bean,还有包括系统中打上@component/controller/service等的bean(主要是service&&controller)。这个Applicationcontext的parentContext就是上面提到的rootContext ,当子applicationContext中找不到相关bean时,会自动去父applicationContext中去寻找。

 

 

posted @ 2014-09-23 23:40  wangkeustc  阅读(1581)  评论(0编辑  收藏  举报