• 项目中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中去寻找。

     

  • 相关阅读:
    贪心[2019.5.25]
    顺序统计算法[2019.5.25]
    polya/burnside 学习
    虚拟机上装uoj
    一些常用的数据结构维护手法
    发一个数据生成器
    圆方树学习
    四校联考 推冰块
    Codeforces Training S03E01泛做
    HAOI2015 泛做
  • 原文地址:https://www.cnblogs.com/wangkeustc/p/3989599.html
Copyright © 2020-2023  润新知