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();
}
}
以上就是全部的代碼了,有興趣的可以在下面評論,技術問題可以私聊我。