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

浙公网安备 33010602011771号