Java 如何在weblogic中实现单例

Java 如何在weblogic中实现单例,java,servlets,singleton,weblogic-10.x,servlet-filters,Java,Servlets,Singleton,Weblogic 10.x,Servlet Filters,我尝试实现一个由过滤器类调用的单例类方法。 filter类和其他类作为共享库添加到WLS 我有两个独立的web应用程序在同一个托管服务器上运行——带过滤器的servlet 所以一切都很好,除了单例被实例化了两次。 请在下面找到代码片段 public class Test { private static Test ref ; private DataSource X; static int Y; long Z ; private Test ()

我尝试实现一个由过滤器类调用的单例类方法。 filter类和其他类作为共享库添加到WLS

我有两个独立的web应用程序在同一个托管服务器上运行——带过滤器的servlet

所以一切都很好,除了单例被实例化了两次。 请在下面找到代码片段

public class Test
{
   private static Test ref ;

   private DataSource X;  
   static int Y;
   long Z ;   


   private Test ()
   {
      // Singleton 
   Z= 100 ;
   }

   public static synchronized Test getinstance()  throws NamingException, SQLException
   {
      if(ref == null)
      {         
         ref = new Test() ;         
         InitialContext ic = new InitialContext();

         ref.X = (DataSource)ic.lookup ("jdbc/Views");
      } 
      return ref ;    
   }

   public Object clone()throws CloneNotSupportedException
   {
       throw new CloneNotSupportedException(); 
   }

   public int sampleMethod (int X) throws SQLException
   {
   }

}
过滤方法:

public final class Filter implements Filter
{
 public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
 {
  try
  {  
   Test ref = Test.getinstance();
   log.logNow(ref.toString());
   .......

  }
 }
}
在日志中,我得到了两个不同的参考——比如

Test@f1a2e06 Test@f180f10


我做错什么了吗?任何帮助都会很好

servlet容器为不同的应用程序使用不同的类加载器。因此,我认为不可能分享一个实例。您可以通过JNDI注册实例。

这是哪个版本的WebLogic?标签表示10.x,但可能是10.0或10.3或11gR1(10.3.x)。顺便说一下,单身在这里没有绝对意义。如果希望每个servlet上下文有一个实例,请使用
ServletContextListener
。如果您希望每个应用程序服务器都有一个实例,请按照Bozho的建议使用JNDI。当然,您可以始终将您的单例类放在父类加载器中(例如,在容器类路径中),然后它将对同一容器中的所有应用程序可见并实例化一次。虽然出于许多原因,我不推荐这种方法,但如果你必须这样做的话……谢谢你的回复。@波佐-我对这有点陌生。你能给我指一下正确的方向吗?如何通过JNDI注册实例?嗨,Bozho,我已经完成了。[.由于我是新手,我仍然无法理解“通过JNDI注册实例”的含义。因此,我有用于筛选等的java类。现在如何注册?一些代码片段?示例可能是?t使用
上下文
对象的
绑定
查找
方法。我刚刚遇到一个类似的问题。如果对象绑定在另一个类加载器(即inf)中,JNDI查找似乎不起作用在WebLogic中运行的两个应用程序中执行操作