2-Hivemind基础
卢宜然
2023-12-01
1-获取服务
Hivemodule.xml要放在classpath指定地址,或jar包中的META-INF/下。
Registry registry = RegistryBuilder.constructDefaultRegistry();
ServiceInterface service = (ServiceInterface)registry.getService("HiveMind.test.testone",ServiceInterface .class);
特殊情况
RegistryBuilder builder = new
RegistryBuilder ();
DefaultClassResolver resolver = new DefaultClassResolver();
builder.addModuleDescriptorProvider( new xmlModuleDescriptorProvider
(resolver,"META-INF/myHivemodule.xml"));
Registry registry = builder.constructRegistry(Locale.getDefault());
2-Ioc的三种实现方式
type-1: interface
type-2: setter/getter
type-3: contructor
3- <implementation>元素用于为知道的serivce-id配置实现类。
创建Service有2种方式:
<create-instance>:使用new方式。
<invoke-factory>元素用于指定以工厂方式实现service。
工厂方式默认以HiveMind内置的service-id = "HiveMind.BuilderFactory"的Service来创建接口实例。
工厂方式有4个属性:
1-primitive:第一次被访问时,创建实例。
2-singleton: 默认,Service被引用的时候,创建一个代理对象,当Service的方法被调用的时候,才真正创建该实例。
3-threaded: 创建时与一个线程绑定在一起。
4-pooled: 池化该service实例。
4-<construct autowire-services="true".../>
当Service很多的时候,为了不使配置文件过于冗长,如果Service实现类中成员变量的类型正好与配置文件中某个服务的接口类型相同的话,将可以自动注入而不需要配置。
实现该功能的3个条件:
1- 只有一个另外的Service配置了该成员变量的接口。
2- Service实现类的构造方法必须是public
3- 成员变量的类型必须是接口。
<service-point id="serviceid" interface="MyInterface">
<invoke-factory>
<construct class="impl.MyInterfaceImpl" initialize-method="init"
autowire-
services="false" />默认为true
</invoke-factory>
</service-ponit>
5-<configuration>..</configuration>
<!-- 定义一个配置点,所有对该配置点的贡献都将加入到一个List中去,然后传递给一个服务的List类型的成员变量中去-->
<configuration-point id="testConfiguration1" shema-id="testSchema1" />
<schema id="testSchema1">
<element name="test"> <!-- 定义一个贡献点的配置节点为test -->
<attribute name="key" required = "true" />
<attribute name="value" required = "true" />
<conversion class="com.HiveMind.configuration.MyConfiguration" />
<!-- 用于将传入的数据,转化为特定的对象,保存到List中去 -->
</element>
</schema>
<!-- 给这个List添加一个元素 -->
<contribution configuration-id="
testConfiguration1
">
<test key="name" value="foo" />
<test key="name2" value="bar" />
</contribution>
<!-- 将添加好的配置点List注入到一个对象的成员变量中去 -->
<service-point id="testService" interface="MyInterface">
<invoke-factory>
<!-- 在构造方法中传入该List -->
<construct class="impl.MyInterfaceImpl">
<configuartion>
testConfiguration1
</configuration>
</construct>
</invoke-factory>
</service-point>
public MyInftefaceImpl(List data){..初始化.};