由于非技术原因,公司的专门成立的支付部,招一批Java程序员,做了支付系统;又由于非技术原因,两个月内,这个部门从领导到程序员全走光了。然后这个支付系统就移交给我们这帮受苦受难的兄弟们维护了。在看他们代码的时候发现了很有趣的东西,就是在tomcat内共享Spring context。
<Resource auth="Container" contextConfigLocation="/com/test/application-context.xml" factory="com.test.TomcatWebApplicationContextResourceFactory" name="bean/RootApplicationContextFactory" type="org.springframework.context.ApplicationContext"/>
上面这段配置的意思就是,当有人通过jndi名称”bean/RootApplicationContextFactory”来查找对象时,容器就新建一个TomcatWebApplicationContextResourceFactory类实例,并调用它的getObjectInstance方法来获得资源对象。这个工厂类要是想javax.naming.spi.ObjectFactory接口。代码如下:
package com.test; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.spi.ObjectFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TomcatWebApplicationContextResourceFactory implements ObjectFactory { private static final String PARAM = "contextConfigLocation"; private static final String DEFAULT = "application-context.xml"; private static ApplicationContext context; //被共享的spring上下文 private void init(String confFile) { context = new ClassPathXmlApplicationContext(confFile); } public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { if (null == context) { // Customize the bean properties from our attributes Reference ref = (Reference) obj; //从xml配置文件里取得contextConfigLocation元素的值 RefAddr addr = ref.get(PARAM); if (null != addr) { String value = (String) addr.getContent(); init(value); } else { init(DEFAULT); } } return context; } }
1.2 在web应用中引用上面定义的资源 <resource-env-ref> <description>Object factory for Root applicationcontext</description> <resource-env-ref-name> bean/RootApplicationContextFactory </resource-env-ref-name> <resource-env-ref-type> org.springframework.context.ApplicationContext </resource-env-ref-type> </resource-env-ref>
1.3 加入依赖的包
shared.loader=/usr/local/jars/*.jar
上面的代码让tomcat载入自定目录里面所有的jar文件。
2 我的看法
|
|