问题场景:如果有10个web应用程序都是用spring进行管理,可以把spring放在comon或者shared目录下让这些程序共享。Spring类要对用户程序的类进行管理,自然要能访问到用户程序的类,而用户的程序显然是放在/WebApp/WEB-INF目录中的,那么被CommonClassloader或SharedClassloader加载的spring如何访问不在其加载范围内的用户程序?
答案: 使用线程上下文加载器。spring加载类所用的classloader都是通过Thread.currentThread().getContextClassLoader()来获取的,而当线程创建时会默认 setContextClassLoader(AppClassLoader),即spring中始终可以获取到这个AppClassLoader(在tomcat里就是WebAppClassLoader)子类加载器来加载bean,以后任何一个线程都可以通过getContextClassLoader()获取到WebAppClassLoader来getbean了。
补充:common,shared/,server目录是tomcat6.x前的目录,在tomcat6.x 后就把这三个目录合并成一个/lib。
网友评论