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();
}
}
以上就是全部的代码了,有兴趣的可以在下面评论,技术问题可以私聊我。