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

扫描二维码关注公众号,回复: 10366953 查看本文章
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();
	}
	
}

以上就是全部的代码了,有兴趣的可以在下面评论,技术问题可以私聊我。

发布了106 篇原创文章 · 获赞 101 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/qq_24434671/article/details/100518454
今日推荐