1. 程式人生 > >Guice 學習(六)使用Provider注入服務( Provider Inject Service)

Guice 學習(六)使用Provider注入服務( Provider Inject Service)

1、定義介面

package com.guice.providerInject;

import com.google.inject.ProvidedBy;

public interface Service {
    public void execute();
}

2、定義實現類

package com.guice.providerInject;

public class OneService implements Service {
    @Override
    public void execute() {
        System.out.println("Hello!  I'M Service 1!"
); } }

3、Provider實現類

package com.guice.providerInject;

import com.google.inject.Provider;

/**
 * TODO : 每次新建一個新的OneService物件出來
 * 
 * @author E468380
 */
public class OneServiceProvider implements Provider<Service> {

    @Override
    public Service get() {
        return new OneService();
    }

}

4、ProviderServiceDemo 測試類

package com.guice.providerInject;

import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Module;

/**
 * 使用上面OneServiceProvider來新建例項 當然如果想自動注入(不使用Module手動關聯)服務的話,可以使用@ProviderBy註解。
 * 
 */
public class ProviderServiceDemo
{
@Inject private Service service; public static void main(String[] args) { ProviderServiceDemo instance = Guice.createInjector(new Module() { @Override public void configure(Binder binder) { binder.bind(Service.class).toProvider(OneServiceProvider.class); } }).getInstance(ProviderServiceDemo.class); instance.service.execute();// Hello! I'M Service 1! } }

5、ProviderServiceDemo2測試類

如果不想使用Module手動關聯服務的話,可以使用@ProviderBy註解。

package com.guice.providerInject;

import com.google.inject.ProvidedBy;

@ProvidedBy(OneServiceProvider.class)
public interface Service {
    public void execute();
}
package com.guice.providerInject;

import com.google.inject.Guice;

public class ProviderServiceDemo2 {
    public static void main(String[] args) {
        ProviderServiceDemo2 instance = Guice.createInjector().getInstance(ProviderServiceDemo2.class);
        // instance.service.execute(); //發現不起作用不知何解 ?
    }
}

6、ProviderServiceDemo3測試類

package com.guice.providerInject;

import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Module;
import com.google.inject.Provider;

/**
 * TODO :可以注入Provider而不是注入服務 
 * ◇由於我們OneServiceProvider每次都是構造一個新的服務出來,
 * 因此在類ProviderServiceDemo3中的provider每次獲取的服務也是不一樣的。
 * 
 * @author E468380
 */
public class ProviderServiceDemo3 {
    @Inject
    private Provider<Service> provider;

    public static void main(String[] args) {

        ProviderServiceDemo3 instance = Guice.createInjector(new Module() {

            @Override
            public void configure(Binder binder) {
                binder.bind(Service.class).toProvider(OneServiceProvider.class);
            }
        }).getInstance(ProviderServiceDemo3.class);

        instance.provider.get().execute();// Hello! I'M Service 1!
    }
}