我是
靠谱客的博主
贪玩路人,最近开发中收集的这篇文章主要介绍
Google Guice 注入(@Inject注解),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
最详细解析:Google Guice 小试牛刀(@Inject注解)
Google Guice之AOP(面向切面编程)
比较全面文档:http://blog.csdn.net/zhaowen25/article/details/52927193
下面的是一些入口
上一节介绍通过注解来实现绑定关系,这一节介绍如何通过@Inject来完成依赖注入的功能:
(1)属性注入
(2)构造方法注入
(3)setter方法注入
一.属性注入
(1)创建一个接口Hello.Java和一个实现类HelloImpl
- package guice.di;
-
- import com.google.inject.ImplementedBy;
-
- @ImplementedBy(HelloImpl.class)
- public interface Hello {
- void sayHello() ;
- }
-
-
- package guice.di;
-
-
- public class HelloImpl implements Hello{
-
- @Override
- public void sayHello() {
- System.out.println("HelloImpl Say Hello");
- }
- }
通过@ImplementedBy注解,将接口和实现类绑定在一起
(2)创建一个HelloCaller(包含一个Hello属性)
- package guice.di;
-
- import com.google.inject.Inject;
-
-
- public class HelloCaller {
-
-
- @Inject
- private Hello hello ; //这个就相当于:private Hello hello = new HelloImpl(); 把Hello实例化了
-
- public void sayHello(){
- hello.sayHello() ;
- }
- }
通过@Inject注解将Hello属性的实例注入进来
(3)创建一个测试类Client
- package guice.di;
-
- import com.google.inject.Binder;
- import com.google.inject.Guice;
- import com.google.inject.Injector;
- import com.google.inject.Module;
-
- public class Client {
-
-
- public static void main(String[] args) {
-
- Injector in = Guice.createInjector(new Module(){
- @Override
- public void configure(Binder arg0) {
-
- }
- }) ;
-
- HelloCaller helloCaller = in.getInstance(HelloCaller.class) ;
-
- helloCaller.sayHello() ;
- }
-
- }
结果:
二. 构造方法注入
(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类
- package guice.di;
-
- import com.google.inject.Inject;
-
- public class HelloCaller1 {
-
- private Hello hello ;
-
- @Inject
- public HelloCaller1(Hello hello){
- this.hello = hello ;
- }
-
- public void sayHello(){
- hello.sayHello() ;
- }
- }
(2)创建测试程序
- package guice.di;
-
- import com.google.inject.Binder;
- import com.google.inject.Guice;
- import com.google.inject.Injector;
- import com.google.inject.Module;
-
- public class Client {
-
-
- public static void main(String[] args) {
-
- Injector in = Guice.createInjector(new Module(){
- @Override
- public void configure(Binder arg0) {
-
- }
- }) ;
-
- HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;
-
- helloCaller.sayHello() ;
-
- }
-
- }
结果:
HelloImpl Say Hello
三,setter方式注入
(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类
- <span style="font-size:14px;">package guice.di;
-
-
- import com.google.inject.Inject;
-
-
- public class HelloCaller2 {
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>private Hello hello ;
-
-
- <span style="white-space:pre"> </span>public Hello getHello() {
- <span style="white-space:pre"> </span>return hello;
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>@Inject
- <span style="white-space:pre"> </span>public void setHello(Hello hello) {
- <span style="white-space:pre"> </span>this.hello = hello;
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>
- }</span>
(2)创建测试程序
- <span style="font-size:14px;">package guice.di;
-
- import com.google.inject.Binder;
- import com.google.inject.Guice;
- import com.google.inject.Injector;
- import com.google.inject.Module;
-
- public class Client {
-
-
- public static void main(String[] args) {
-
- Injector in = Guice.createInjector(new Module(){
- @Override
- public void configure(Binder arg0) {
-
- }
- }) ;
-
- HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;
-
- helloCaller.sayHello() ;
-
- }
-
- }</span>
结果:
HelloImpl Say Hello
上面介绍了Guice框架的三种注入方式:属性注入,构造方法注入,setter方法注入
最最重要的是,在自己的netty后台服务项目中,启动netty服务的时候startup方法可以将Injector对象传入到WebContainer类中,然后在Registerxx中,注册User类为web接口时,将Injector对象放入对应的User类中,在Registerxx注册服务时实例化User类的时候,就将User中的Injector属性赋值。然后在User类中就可以使用Injector中的对象。
其实和Spring差不多,只是一个是用xml的,一个使用注解的。
特别关注:
- Injector in = Guice.createInjector(new Module(){
- @Override
- public void configure(Binder arg0) {
-
- }
- }) ;
思想提升
Guice 希望在不牺牲可维护性的情况下去除所有这些程式化的代码。
使用 Guice,你只需要实现模块类。Guice 将一个绑定器传入你的模块,你的模块使 用绑定器来连接接口和实现。以下模块代码告诉 Guice 将 Service映射到单件模式的 ServiceImpl:
public class MyModule implements Module {
public void configure(Binder binder) {
binder.bind(Service.class)
.to(ServiceImpl.class)
.in(Scopes.SINGLETON);
}
}
模块类告诉 Guice 我们想注入什么东西。那么,我们该如何告诉 Guice 我们想把它 注入到哪里呢?使用 Guice,你可以使用 @Inject 标注你的构造器,方法或字段:
public class Client {
private final Service service;
@Inject
public Client(Service service) {
this.service = service;
}
public void go() {
service.go();
}
}
@Inject 标注可以清楚地告诉其他程序员你的类中哪些成员是被注入的。
为了让 Guice向 Client 中注入,我们必须直接让 Guice 帮我们创建Client 的实例 ,或者,其他类必须包含被注入的Client 实例。
将对象A注入到对象B中用@inject
而获取对象时:可以直接使用
Test test = injector.getInstance(Test.class);
System.out.println(test.getA());
test.setA("SFFFFFFFFFFFFFF");
System.out.println(test.getA());
不管Test.Class是不是impl还是interface。甚至是与Guice没有任何关系的类,我们都可以获得:
Test test = injector.getInstance(Test.class);
就相当于:
Test test = new Test();
如果Test类中有Inject注解,那么再将注解的对象注入test实体类中。还有一点需要注意
Test test1 = injector.getInstance(Test.class);
Test test2 = injector.getInstance(Test.class);
test1和test2是同一个对象,同一个路径的。而下面的代码只是实现注解对象的绑定,从一个接口类绑定到实体类。没有其他别的含义
binder.bind(Service.class)
.to(ServiceImpl.class)
最后
以上就是贪玩路人为你收集整理的Google Guice 注入(@Inject注解)的全部内容,希望文章能够帮你解决Google Guice 注入(@Inject注解)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复