仅加载课程一次

时间:2010-09-14 07:33:28

标签: java

  1. 我正在实施一个使用第三方提供商服务的服务类。
  2. 用户将与Service类进行交互以获取服务提供商的服务。
  3. 我的要求:
    我只想加载一次服务类(或者在内存中长时间持续2小时) 我的问题:
    如何检查此服务类仅加载一次?
    如果每次发出请求时都加载它,那么它们是否有任何方法可以保留在内存中?


    这是我的服务类的代码

    package com.example;
    import com.example.spi.Multiplication;
    import java.util.Iterator;
    
    import java.util.ServiceLoader;
    
    public class MultiplicationService implements Multiplication{
    
        private static MultiplicationService service;
        private ServiceLoader loader;
        public static int no=0;
        private MultiplicationService() {       
            loader = ServiceLoader.load(Multiplication.class);
       }
    
         public static synchronized MultiplicationService getInstance() {
            if (service == null) {
                service = new MultiplicationService();
            }         
            return service;
        }
    
         public int getMultiplication(int a,int b){
            int result = 0;
    
            try {
                Iterator multiply = loader.iterator();
            while (result == 0 && multiply.hasNext())
                {  
                    Multiplication d = multiply.next();
                    result = d.getMultiplication(a,b);
                    System.out.println("Result is : "+ result);
                }
            } catch (Exception serviceError) {
                result = 0;
                serviceError.printStackTrace();
    
            }
            return result;
        }
     }
    
    

    由于

3 个答案:

答案 0 :(得分:2)

转到 Spring 创建一个bean条目并保持单例[默认情况下] 当初始化上下文时,它将创建该类的一个对象,然后它将不会触及该类,并且您的目的将得到解决。

答案 1 :(得分:2)

您可以实施singleton pattern。一种选择是使用枚举:

public enum Service {
    INSTANCE;

    private ThirdPartyService service = new ThirdPartyService();

    public ThirdPartyService getService() {
        return service;
    }
}

但是不要过度使用该模式,因为这会使您的代码难以进行单元测试。

答案 2 :(得分:0)

您还可以查看OSGi,它有一个服务模型,并会为您处理所有课程加载。您还可以combine it with Spring从两个世界中获益。