带有@Inject注解的类 使用 injector.getInstance初始化

http://blog.csdn.net/java_le/article/details/24851251

Google Guice 注入(@Inject注解)

原创 2014年05月01日 22:52:16
  • 3816

上一节介绍通过注解来实现绑定关系,这一节介绍如何通过@Inject来完成依赖注入的功能:

(1)属性注入

(2)构造方法注入

(3)setter方法注入

一.属性注入

(1)创建一个接口Hello.java和一个实现类HelloImpl

  1. package guice.di;
  2. import com.google.inject.ImplementedBy;
  3. //将这个接口和实现类HelloImpl绑定到一起
  4. @ImplementedBy(HelloImpl.class)
  5. public interface Hello {
  6. void sayHello() ;
  7. }
  8. package guice.di;
  9. //这里没有加@Singleton,表示是动态创建这个类,不是单例的
  10. public class HelloImpl implements Hello{
  11. @Override
  12. public void sayHello() {
  13. System.out.println("HelloImpl Say Hello");
  14. }
  15. }

通过@ImplementedBy注解,将接口和实现类绑定在一起

(2)创建一个HelloCaller(包含一个Hello属性)

  1. package guice.di;
  2. import com.google.inject.Inject;
  3. //HelloCaller将会去调用Hello这个接口提供的服务
  4. public class HelloCaller {
  5. //通过@Inject,来完成属性的注入
  6. @Inject
  7. private Hello hello ;
  8. //调用Hello的sayHello方法(实际上就是去调用HelloImpl的sayHello,因为我们将Hello的实现指定是HelloImpl)
  9. public void sayHello(){
  10. hello.sayHello() ;
  11. }
  12. }

通过@Inject注解将Hello属性的实例注入进来

(3)创建一个测试类Client

  1. package guice.di;
  2. import com.google.inject.Binder;
  3. import com.google.inject.Guice;
  4. import com.google.inject.Injector;
  5. import com.google.inject.Module;
  6. public class Client {
  7. //创建一个测试程序
  8. public static void main(String[] args) {
  9. Injector in = Guice.createInjector(new Module(){
  10. @Override
  11. public void configure(Binder arg0) {
  12. //什么也不写
  13. }
  14. }) ;
  15. //得到HelloCaller的实例
  16. HelloCaller helloCaller = in.getInstance(HelloCaller.class) ;
  17. //调用sayHello方法
  18. helloCaller.sayHello() ;
  19. }
  20. }

结果:

  1. HelloImpl Say Hello

二. 构造方法注入

(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类

  1. package guice.di;
  2. import com.google.inject.Inject;
  3. public class HelloCaller1 {
  4. //包含一个Hello属性
  5. private Hello hello ;
  6. //@Inject注解写在构造方法上,通过构造方法的方式注入属性hello
  7. @Inject
  8. public HelloCaller1(Hello hello){
  9. this.hello = hello ;
  10. }
  11. public void sayHello(){
  12. hello.sayHello() ;
  13. }
  14. }

(2)创建测试程序

  1. package guice.di;
  2. import com.google.inject.Binder;
  3. import com.google.inject.Guice;
  4. import com.google.inject.Injector;
  5. import com.google.inject.Module;
  6. public class Client {
  7. //创建一个测试程序
  8. public static void main(String[] args) {
  9. Injector in = Guice.createInjector(new Module(){
  10. @Override
  11. public void configure(Binder arg0) {
  12. //什么也不写
  13. }
  14. }) ;
  15. //得到HelloCaller的实例
  16. HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;
  17. //调用sayHello方法
  18. helloCaller.sayHello() ;
  19. }
  20. }

结果:

HelloImpl Say Hello

三,setter方式注入

(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类

  1. <span style="font-size:14px;">package guice.di;
  2. import com.google.inject.Inject;
  3. public class HelloCaller2 {
  4. <span style="white-space:pre">  </span>
  5. <span style="white-space:pre">  </span>private Hello hello ;
  6. <span style="white-space:pre">  </span>public Hello getHello() {
  7. <span style="white-space:pre">      </span>return hello;
  8. <span style="white-space:pre">  </span>}
  9. <span style="white-space:pre">  </span>//通过setter方法来注入hello属性
  10. <span style="white-space:pre">  </span>@Inject
  11. <span style="white-space:pre">  </span>public void setHello(Hello hello) {
  12. <span style="white-space:pre">      </span>this.hello = hello;
  13. <span style="white-space:pre">  </span>}
  14. <span style="white-space:pre">  </span>
  15. }</span>

(2)创建测试程序

  1. <span style="font-size:14px;">package guice.di;
  2. import com.google.inject.Binder;
  3. import com.google.inject.Guice;
  4. import com.google.inject.Injector;
  5. import com.google.inject.Module;
  6. public class Client {
  7. //创建一个测试程序
  8. public static void main(String[] args) {
  9. Injector in = Guice.createInjector(new Module(){
  10. @Override
  11. public void configure(Binder arg0) {
  12. //什么也不写
  13. }
  14. }) ;
  15. //得到HelloCaller的实例
  16. HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;
  17. //调用sayHello方法
  18. helloCaller.sayHello() ;
  19. }
  20. }</span>

结果:

HelloImpl Say Hello

上面介绍了Guice框架的三种注入方式:属性注入,构造方法注入,setter方法注入

Guice 注入(@Inject注解)的更多相关文章

  1. Spring中@Autowired、@Resource和@Inject注解的使用和区别

    在使用Spring进行项目开发的时候,会大量使用到自动装配,那自动装配是什么呢?简单来说:Spring 利用依赖注入(DI)功能,完成SpringIOC容器中各个组件之间的依赖关系赋值管理. 下面介绍 ...

  2. 【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!

    写在前面 我在 冰河技术 微信公众号中发表的<[Spring注解驱动开发]使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?>一文中,介绍了如何使 ...

  3. Spring第四天,BeanPostProcessor源码分析,彻底搞懂IOC注入及注解优先级问题!

  4. Spring构造器注入、set注入和注解注入

    记得刚开始学spring的时候,老师就反复的提到依赖注入和切面,平常的java开发中,在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,sp ...

  5. Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook

    前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...

  6. Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)

    什么是依赖注入 在以前的java开发中,某个类中需要依赖其它类的方法时,通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,spring提出了依赖注入的思想,即依赖类不由程序员 ...

  7. Android的so注入( inject)和函数Hook(基于got表) - 支持arm和x86

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53942648 前面深入学习了古河的Libinject注入Android进程,下面来 ...

  8. spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异

    为了探寻 '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Perso ...

  9. Spring Bean 注入 2 注解篇

    1. 自动装配注解 配置applicationContext.xml开启注解 <?xml version="1.0" encoding="UTF-8"?& ...

随机推荐

  1. C++STL——set

    一.相关定义 set 集合,有唯一性,即每一个元素只有一个: 是一个有序的容器,里面的元素都是排序好的: 支持插入,删除,查找等操作. 注意 set中的元素可以是任意类型的,但是由于需要排序,所以元素 ...

  2. Postmortem Report 第一轮迭代事后分析报告

    一.设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件<BlueZ>是一款全新动作类塔防游戏.与市面上已经存在的塔防游戏不同 ...

  3. springboot ueditor 使用心得

    1.将ueditor引入项目中会发现,图片不能上传,返回值意思是因配置文件错误,导致图片无法上传 默认情况是使用jsp初始配置文件,这就需要项目支持jsp解析 在maven中引入 <!--添加对 ...

  4. [C/C++] C++中new的语法规则

    int *x = new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) ); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址 ...

  5. JS调用C#中的变量

    今天早上做项目,需要使用JS来得到数据库里面表的行数.经过查找资料,知道可以使用在C#中定义一个全局变量.在JS中调用即可,自己总结一下:供日后参考; public string Str() { st ...

  6. bootstrap-table 增加序号列(支持分页)

    columns: [ { checkbox: true }, { title: '序号', align: 'center', halign: 'center', formatter: function ...

  7. BZOJ 1040: [ZJOI2008]骑士 | 在基环外向树上DP

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题解: 我AC了 是自己写的 超开心 的 考虑断一条边 这样如果根节点不选答案一定正确 ...

  8. MD5算法解析

    MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. MD5将 ...

  9. 【POJ 3169 Layout】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 12565Accepted: 6043 Description Like every ...

  10. 【NOIP模拟赛】书 数学+期望概率

    biubiu~~~ 对于这道傻题.........我考场上退了一个多小时才推出来这个东西是排列...........然后我打的dfs效率n!logInf正好n=9是最后一个能过的数结果前三个点的n全是 ...