Java 创建类似于OSGI中用户定义对象的映射对象

Java 创建类似于OSGI中用户定义对象的映射对象,java,osgi,apache-felix,Java,Osgi,Apache Felix,我试图使用osgi@reference(ie)创建一个映射对象,将下面的类注册为工厂,并将依赖项注册为Hashmap对象。我的意图是使用工厂创建一个对象,该工厂应该创建一个hashmap。当我试图将其注册为工厂状态时,我并不满意。是否可以通过以下方法创建贴图对象?如果没有,谁能告诉我我做错了什么?或者为什么我们不应该这样做?因为Map是一个接口 @Component(name = "ExampleComponentFactoryServiceProvider1", factory = "exam

我试图使用osgi@reference(ie)创建一个映射对象,将下面的类注册为工厂,并将依赖项注册为Hashmap对象。我的意图是使用工厂创建一个对象,该工厂应该创建一个hashmap。当我试图将其注册为工厂状态时,我并不满意。是否可以通过以下方法创建贴图对象?如果没有,谁能告诉我我做错了什么?或者为什么我们不应该这样做?因为Map是一个接口

@Component(name = "ExampleComponentFactoryServiceProvider1", factory = "example.factory.provider1")
@Service
public class ExampleComponentFactoryServiceProvider1 implements ExampleFactoryService {

    @Reference(name = "MapObject", bind = "createMap", unbind = "disolveMapObject", referenceInterface = Map.class)
    private Map<String, String> testMap = null;

    @Activate
    public void activate(Map<String, String> props) {
        System.out.println("Activated 1 !!!!!");
    }

    public void createMap(Map<String, String> aMap) {
        this.testMap = aMap;
        System.out.println("Map created !! " + testMap);
    }

    public void disolveMapObject(Map<String, String> aMap) {
        this.testMap = null;
    }

    @Override
    public void start() {
        System.out.println("Started 1 !!!!");
    }

    @Override
    public void stop() {
        System.out.println("Stopped 1 !!!!");
    }
}
@Component(name=“ExampleComponentFactoryServiceProvider1”,factory=“example.factory.provider1”)
@服务
公共类ExampleComponentFactoryServiceProvider1实现ExampleFactoryService{
@引用(name=“MapObject”、bind=“createMap”、unbind=“disolveMapObject”、referenceInterface=Map.class)
私有映射testMap=null;
@激活
公共空间激活(地图道具){
System.out.println(“已激活1!!!”;
}
公共void createMap(映射aMap){
this.testMap=aMap;
System.out.println(“创建映射!!”+testMap);
}
public void dissolveMapObject(映射aMap){
this.testMap=null;
}
@凌驾
公开作废开始(){
System.out.println(“开始1!!!!”);
}
@凌驾
公共停车场(){
System.out.println(“停止1!!!!”);
}
}

我认为这行不通@引用用于绑定OSGi服务。因此,只有当有人发布了Map类型的服务时,这才有效


您希望地图内容从何而来?

明白了!谢谢Chirstian。作为参考,某些内容应该作为服务公开,即使它是内部java对象(映射、列表、集合)。。虽然我会小心使用地图作为服务,因为它太通用了。你很可能会选错一个。问题又来了。地图内容来自哪里?我的尝试是直接创建java对象,而不是注册为服务。因为我的假设是默认对象不需要将其注册为服务,因为所有内容都在vm上运行。但从你的解释中,我明白了一切都应该作为服务公开,以便通过引用将其取回。是的。在DS中,这是唯一的方法。问题是你为什么需要@Reference。为什么不自己创建对象呢?