原创

飞天无敌依赖注入框架Google Guice

1.Guice

为什么敢用Guice

  1. 国内电商行业前三的某厂核心交易部门做的组件化SDK,其容器的依赖注入框架就是Guice ,在下就是参与者(商业技术机密不能再外漏了)
  2. 谷歌内部大面积使用Guice ,后期维护升级不用担心

Guice优点

Spring框架提供的依赖注入基本每个程序员都听说过了,无疑是最佳选择了
但是有时候 写一个IM工程缺不想引入Spring框架一堆
这时候Guice就是最好的选择了,Guice 包 4.2.2版仅仅828K
Guice的启动速度非常快,完全是纯净的依赖注入的框架,没有其他任何模块
使用Guice的好处远不止于此。。。在嵌入方面做的更好,更方便,各位大侠用了之后可以慢慢体会

2.Guice核心点依赖注入上代码了

  1. 依赖注入(Dependency Injection)是一种思想。
  2. 实际的编程中,如果我们想要使用一个class的实例,那么必须要调用构造方法new class()手动将其实例化,如果这个class中又有对其他class属性的引用,那么在构造方法中,又要调用其他class的构造方法将其实例化,这就是依赖
  3. Guice这种依赖注入框架的作用就是接管class之间的依赖关系,如果我们想要使用一个class的实例,Guice会自动生成实现类的实例并交给我们,这就是注入

1.利用Module的依赖注入,类似Spring中的applicationContext.xml

"定义接口"
public interface UserInfoService {
     String getInfo();
}

"实现类"
public class UserInfoServiceImpl implements UserInfoService{
    @Override
    public String getInfo() {
        return "lsh";
    }
}

"测试"
public static void main(String[] a){
    Injector injector = Guice.createInjector(new Module() {
        @Override
        public void configure(Binder binder) {
            binder.bind(UserInfoService.class).to(UserInfoServiceImpl.class);
        }
    });
    UserInfoService u = injector.getInstance(UserInfoService.class);
    String res = u.getInfo();
    System.out.println(res);"//lsh"
}

这就是个很简单的例子。手动绑定类和实现类,然后显是获取bean,类似于spring的getBean()

2.基于注解的依赖注入

"使用注解绑定实现类"
@ImplementedBy(UserInfoServiceImpl.class)
public interface UserInfoService {

     String getInfo();
}

"实现类"
public class UserInfoServiceImpl implements UserInfoService{
    @Override
    public String getInfo() {
        return "lsh";
    }
}

"测试"
public static void main(String[] a){
    Injector injector = Guice.createInjector();
    UserInfoService o = injector.getInstance(UserInfoService.class);
    System.out.println(o.getInfo());"//lsh"
}

也可以用@ProvidedBy来绑定,不建议用,谁用谁知道
在默认情况下,每次调用getInstance方法,都会创建一个新的对象并返回(Provider注入与实例注入除外)
System.out.println(injector.getInstance(UserInfoService.class).hashCode()); for循环测试一下就可以了
如果想实现单例在实现类上加上注解即可

@Singleton
public class UserInfoServiceImpl implements UserInfoService{
    @Override
    public String getInfo() {
        return "lsh";
    }
}

3.注入的方式

1.Setter注入(没必要写了,太常见了猜都能猜到怎么回事)

2.构造函数注入(没必要写了,太常见了猜都能猜到怎么回事)

3.还可以利用 @Named注解完成常量注入

4.静态变量注入

@Inject private static UserInfoService userInfoService;

5.属性注解注入

@ImplementedBy(UserInfoServiceImpl.class)
public interface UserInfoService {

     String getInfo();
}

@Singleton
public class UserInfoServiceImpl implements UserInfoService{
    @Override
    public String getInfo() {
        return "lsh";
    }
}

public class A {
    @Inject
    private UserInfoService userInfoService;

    public static void main(String[] a){
        Injector injector = Guice.createInjector();
        A ac = injector.getInstance(A.class);
        System.out.println(ac.userInfoService.getInfo());"//lsh"
    }
}

去掉 @Inject注解,程序就会抛出NullPointerException

4.总结

依赖注入思想的精华之处:由容器来解决依赖对象的构建问题,程序员只需要提供属性的关联关系即可。使得程序松耦合,减少代码之间的依赖关系,便于后续的修改

源码https://github.com/Fireflyi/xiaoqingxin/tree/master/guice

正文到此结束
本文目录