Guice實例代碼分享實現IOC依賴注入的功能

Guice是Google開發的一個輕量級,基於Java5(主要運用泛型與註釋特性)的依賴注入框架(IOC)。Guice非常小而且快。Guice是類型安全的,它能夠對構造函數,屬性,方法(包含任意個參數的任意方法,而不僅僅是setter方法)進行注入。Guice採用Java加註解的方式進行託管對象的配置,充分利用IDE編譯器的類型安全檢查功能和自動重構功能,使得配置的更改也是類型安全的。Guice提供模塊對應的抽象module,使得架構和設計的模塊概念產物與代碼中的module類一一對應,更加便利的組織和梳理模塊依賴關係,利於整體應用內部的依賴關係維護,而其他IOC框架是沒有對應物的。此外,藉助privateModule的功能,可以實現模塊接口的明確導出和實現封裝,使得支持多數據源這類需求實現起來異常簡單。

pom依賴爲:

<dependency>
	<groupId>com.google.inject</groupId>
	<artifactId>guice</artifactId>
	<version>4.1.0</version>
</dependency>

下面直接上代碼,大佬繞過,一共分爲8天。

day1

package com.xz.helloworld.guice.day1;

public interface HelloGuice {

	public void sayHello(); 
	
}


////////////////////////////////////////////////

package com.xz.helloworld.guice.day1;

public class HelloGuiceImpl implements HelloGuice{

	public void sayHello() {
		System.out.println("say hello");
	}

}


////////////////////////////////////////////////


package com.xz.helloworld.guice.day1;

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

public class HelloGuiceModule implements Module{

	public void configure(Binder binder) {
		binder.bind(HelloGuice.class).to(HelloGuiceImpl.class);
	}

}


////////////////////////////////////////////////

package com.xz.helloworld.guice.day1;

import com.google.inject.Guice;
import com.google.inject.Injector;

public class MainTest {

	public static void main(String[] args) {
		
		Injector injector = Guice.createInjector(new HelloGuiceModule());
		HelloGuice helloGuice = injector.getInstance(HelloGuiceImpl.class);
		helloGuice.sayHello();
	}
	
}

day2

package com.xz.helloworld.guice.day2;

import com.google.inject.ImplementedBy;

@ImplementedBy(HelloGuiceImpl.class)
public interface HelloGuice {

	public void sayHello(); 
	
}


////////////////////////////////////////////////


package com.xz.helloworld.guice.day2;

public class HelloGuiceImpl implements HelloGuice{

	public void sayHello() {
		System.out.println("say hello");
	}

}


////////////////////////////////////////////////


package com.xz.helloworld.guice.day2;

import com.google.inject.Guice;
import com.google.inject.Injector;

public class MainTest {

	public static void main(String[] args) {
		
		Injector injector =Guice.createInjector();
		HelloGuice helloGuice = injector.getInstance(HelloGuice.class);
		helloGuice.sayHello();
	}
	
}



////////////////////////////////////////////////

day3

package com.xz.helloworld.guice.day3;

import com.google.inject.ImplementedBy;

@ImplementedBy(Dog.class)
public interface Animal {

	public void color(); 
	
}


//////////////////////////////////////


package com.xz.helloworld.guice.day3;

public class Dog implements Animal{

	public void color() {
		System.out.println(" red ");
	}

}


////////////////////////////////////


package com.xz.helloworld.guice.day3;

import com.google.inject.ImplementedBy;

@ImplementedBy(HelloGuiceImpl.class)
public interface HelloGuice {

	public void sayHello(); 
	
}


///////////////////////////////////


package com.xz.helloworld.guice.day3;

public class HelloGuiceImpl implements HelloGuice{

	public void sayHello() {
		System.out.println("say hello");
	}

}


/////////////////////////////////

package com.xz.helloworld.guice.day3;

import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

public class MainTest {

	@Inject
	private Animal animal;
	@Inject
	private HelloGuice helloGuice;
	
	public static void main(String[] args) {
		
		Injector injector =Guice.createInjector();
		MainTest m = injector.getInstance(MainTest.class);
		m.animal.color();
		m.helloGuice.sayHello();
		
		
		methodTest1();
	}
	
	public static void methodTest1() {
		
		MainTest m = new MainTest();
		Guice.createInjector().injectMembers(m);
		m.animal.color();
		m.helloGuice.sayHello();
	}
	
}

day4

package com.xz.helloworld.guice.day4;

public interface Animal {

	public void color(); 
	
}



///////////////////////////////////////


package com.xz.helloworld.guice.day4;

import com.google.inject.Inject;
import com.google.inject.Singleton;

@Singleton
public class Cat implements Animal{

	@Inject
	private HelloGuiceImpl hello;
	
	public void color() {
		hello.sayHello();
		System.out.println(" yello ");
	}
	
}


///////////////////////////////////////


package com.xz.helloworld.guice.day4;

import com.google.inject.Inject;
import com.google.inject.Singleton;

@Singleton
public class Dog implements Animal{

	@Inject
	private HelloGuiceImpl hello;
	
	public void color() {
		hello.sayHello();
		System.out.println(" red ");
	}

}


///////////////////////////////////////

package com.xz.helloworld.guice.day4;

public interface HelloGuice {

	public void sayHello(); 
	
}



//////////////////////////////////////


package com.xz.helloworld.guice.day4;

import com.google.inject.Singleton;

@Singleton
public class HelloGuiceImpl implements HelloGuice{

	public void sayHello() {
		System.out.println("say hello");
	}

}


//////////////////////////////////////


package com.xz.helloworld.guice.day4;

import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;

public class MainTest {

	@Named("cat")
	@Inject
	private Animal animal;
	
	public static void main(String[] args) {
		
		Injector injector =Guice.createInjector(new MyModul());
		MainTest m = injector.getInstance(MainTest.class);
		m.animal.color();
	}
	
}



//////////////////////////////////////////


package com.xz.helloworld.guice.day4;

import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.name.Names;

public class MyModul implements Module{

	public void configure(Binder binder) {
		binder.bind(Animal.class).annotatedWith(Names.named("dog")).to(Dog.class);
		binder.bind(HelloGuiceImpl.class).annotatedWith(Names.named("hello")).to(HelloGuiceImpl.class);
		binder.bind(Animal.class).annotatedWith(Names.named("cat")).to(Cat.class);
	}

}

day5

package com.xz.helloworld.guice.day5;

import com.google.inject.AbstractModule;

// 這裏就是綁定邏輯的地方
public class AnimalModule extends AbstractModule {
    @Override
    protected void configure() {
        // 這行的意思即是把Dog綁定給IAnimal
        bind(IAnimal.class).to(Dog.class);
        // 下面
        bind(IAnimal.class).annotatedWith(Super.class).to(SuperDog.class);
    }
}



////////////////////////////////////////////////


package com.xz.helloworld.guice.day5;

import com.google.inject.Inject;

// service
public class AnimalService {

    @Inject
    private IAnimal dog;

    //打上了@Super的註解,Guice在注入的時候會根據在Module裏面配置的綁定關係注入對應的實現類
    @Inject  
    @Super
    private IAnimal superDog;

    public void talk() {
        System.out.println("dog will talk");
        dog.talk();
        System.out.println("super will talk");
        superDog.talk();
    }
}



//////////////////////////////////////

package com.xz.helloworld.guice.day5;
// 實現類dog
public class Dog implements IAnimal {

	public void talk() {
        System.out.println("i am dog!");
    }
}



//////////////////////////////////////


package com.xz.helloworld.guice.day5;
// 先來一個接口
public interface IAnimal {
    void talk();
}


/////////////////////////////////////


package com.xz.helloworld.guice.day5;

import com.google.inject.Guice;
import com.google.inject.Injector;

public class MainTest {

	
	public static void main(String[] args) {
		
		Injector injector = Guice.createInjector(new AnimalModule());
		AnimalService animalService = injector.getInstance(AnimalService.class);
        animalService.talk();
	}
	
}


//////////////////////////////////////


package com.xz.helloworld.guice.day5;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.google.inject.BindingAnnotation;

// 這個類有點類似於Spring的Qualife
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@BindingAnnotation
public @interface Super {
}



////////////////////////////////////////


package com.xz.helloworld.guice.day5;
// 實現類 SuperDog
public class SuperDog implements IAnimal {

	public void talk() {
		// TODO Auto-generated method stub
		System.out.println("i am super dog");
	}
}

day6

package com.xz.helloworld.guice.day6;

import com.google.inject.ImplementedBy;

@ImplementedBy(HelloGuiceImpl.class)
public interface HelloGuice {

	public void sayHello(); 
	
}



//////////////////////////////////


package com.xz.helloworld.guice.day6;

public class HelloGuiceImpl implements HelloGuice{

	public void sayHello() {
		System.out.println("say hello");
	}

}



///////////////////////////////


package com.xz.helloworld.guice.day6;

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

public class HelloModul implements Module{

	public void configure(Binder binder) {
		binder.bind(HelloGuice.class).toProvider(new HelloProvider());
	}
	
	
}
class HelloProvider implements Provider<HelloGuice>{

	HelloGuiceImpl h = new HelloGuiceImpl();
	public HelloGuice get() {
		return h;
	}

}



///////////////////////////////////////


package com.xz.helloworld.guice.day6;

import com.google.inject.Guice;
import com.google.inject.Injector;

public class MainTest {

	public static void main(String[] args) {
		
		Injector injector = Guice.createInjector(new HelloModul());
		HelloGuice hell= injector.getInstance(HelloGuice.class);
		hell.sayHello();
	}
	
}

day7

package com.xz.helloworld.guice.day7;

import com.google.inject.ProvidedBy;

@ProvidedBy(HelloGuiceImpl.class)
public interface HelloGuice {

	public void sayHello(); 
	
}



/////////////////////////////////////


package com.xz.helloworld.guice.day7;

import com.google.inject.Provider;

public class HelloGuiceImpl implements HelloGuice,Provider<HelloGuice>{

	public void sayHello() {
		System.out.println("say hello");
	}

	public HelloGuice get() {
		return new HelloGuiceImpl();
	}

}


////////////////////////////////////


package com.xz.helloworld.guice.day7;

import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

public class MainTest {

	
	private HelloGuiceImpl helloGuiceImpl;
	
	/**
	 * 構造函數注入
	 * @param helloGuiceImpl
	 */
	@Inject
	public MainTest(HelloGuiceImpl helloGuiceImpl) {
		this.helloGuiceImpl = helloGuiceImpl;
	}
	
	public static void main(String[] args) {
		
		Injector injector = Guice.createInjector();
		HelloGuice hell= injector.getInstance(HelloGuice.class);
		hell.sayHello();
		
		System.out.println("---------------------");
		constructionInject();
	}
	
	
	public static void constructionInject() {
		Injector injector = Guice.createInjector();
		MainTest  m= injector.getInstance(MainTest.class);
		m.helloGuiceImpl.sayHello();
		
	}
	
}

day8

package com.xz.helloworld.guice.day8;

import com.google.inject.ProvidedBy;

@ProvidedBy(HelloGuiceImpl.class)
public interface HelloGuice {

	public void sayHello(); 
	
}



///////////////////////////////////////



package com.xz.helloworld.guice.day8;

import com.google.inject.Provider;

public class HelloGuiceImpl implements HelloGuice,Provider<HelloGuice>{

	public void sayHello() {
		System.out.println("say hello");
	}

	public HelloGuice get() {
		return new HelloGuiceImpl();
	}

}



////////////////////////////////////


package com.xz.helloworld.guice.day8;

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

public class MainTest {

	@Inject
	private static  HelloGuiceImpl helloGuiceImpl;

	
	public static void main(String[] args) {
		
		/**
		 * 靜態屬性註冊
		 */
		Guice.createInjector(new Module() {
			public void configure(Binder binder) {
				binder.requestStaticInjection(MainTest.class);
			}
		});
		helloGuiceImpl.sayHello();
	}
	
}

以上就是全部的代碼了,有興趣的可以在下面評論,技術問題可以私聊我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章