1.2.1 基本属性注入
首先来看一个例子。Service.java
@ImplementedBy(ServiceImpl.class)
public interface Service {
void execute();
}
ServiceImpl.java
public class ServiceImpl implements Service {
@Override
public void execute() {
System.out.println("This is made by Teny (www.teny32.blog.51cto.com).");
}
}
FieldInjectDemo.java
5 public class FieldInjectDemo {
6 @Inject
7 private Service servcie;
8 public Service getServcie() {
9 return servcie;
10 }
11 public static void main(String[] args) {
12 FieldInjectDemo demo = Guice.createInjector().getInstance(FieldInjectDemo.class);
13 demo.getServcie().execute();
14 }
15 }
这个例子比较简单。具体来说就是将接口Service通过@Inject注解注入到FieldInjectDemo类中,然后再FieldInjectDemo类中使用此服务而已。当然Service服务已经通过@ImplementedBy注解关联到ServiceImpl 类中,每次生成一个新的实例(非单例)。注意,这里FieldInjectDemo类没有通过Module等关联到Guice中,具体可以查看《》。
意料之中得到了我们期待的结果。
同样,我们通过问答的方式来加深理解(注意,入门教程我们只是强调怎么使用,至于原理和底层的思想我们放到高级教程中再谈)。
问题(1):可以自己构造FieldInjectDemo 对象而不通过Guice么?
1 /** field inject demo2
2 * @author Teny (www.teny32.blog.51cto.com)
3 * @version $Rev: 73 $
4 */
5 public class FieldInjectDemo2 {
6 @Inject
7 private Service servcie;
8 public Service getServcie() {
9 return servcie;
10 }
11 public static void main(String[] args) {
12 FieldInjectDemo2 fd = new FieldInjectDemo2();
13 fd.getServcie().execute();
14 }
15 }
就像上面的例子中一样,然后运行下看看?非常不幸,我们得到了一个谁都不喜欢的结果。
Exception in thread "main" java.lang.NullPointerException
at cn.imxylz.study.guice.inject.FieldInjectDemo2.main(FieldInjectDemo2.java:22)
很显然,由于FieldInjectDemo2不属于Guice容器(暂且称为容器吧)托管,这样Service服务没有机会被注入到FieldInjectDemo2类中。
问题(2):可以注入静态属性么?
看下面的代码。
1 public class FieldInjectDemo2 {
2 @Inject
3 private static Service servcie;
4 public static Service getServcie() {
5 return servcie;
6 }
7 public static void main(String[] args) {
8 FieldInjectDemo2 fd = Guice.createInjector().getInstance(FieldInjectDemo2.class);
9 FieldInjectDemo2.getServcie().execute();
10 }
11 }
很不幸!运行结果告诉我们Guice看起来还不支持静态字段注入。
好了,上面两个问题我们暂且放下,我们继续学习其它注入功能。
1.2.2 构造函数注入(Constructor Inject)
继续看例子。例子是说明问题的很好方式。
1 /**
2 * $Id: ConstructorInjectDemo.java 75 2009-12-23 14:22:35Z xylz $
3 * xylz study project (www.teny32.blog.51cto.com)
4 */
5 package cn.imxylz.study.guice.inject;
6
7 import com.google.inject.Guice;
8 import com.google.inject.Inject;
9
10 /** a demo with constructor inject
11 * @author Teny(www.teny32.blog.51cto.com)
12 * @version $Rev: 75 $
13 */
14 public class ConstructorInjectDemo {
15
16 private Service service;
17 @Inject
18 public ConstructorInjectDemo(Service service) {
19 this.service=service;
20 }
21 public Service getService() {
22 return service;
23 }
24 public static void main(String[] args) {
25 ConstructorInjectDemo cid = Guice.createInjector().getInstance(ConstructorInjectDemo.class);
26 cid.getService().execute();
27 }
28
29 }
30
31
我们在构造函数上添加@Inject来达到自动注入的目的。构造函数注入的好处是可以保证只有一个地方来完成属性注入,这样可以确保在构造函数中完成一些初始化工作(尽管不推荐这么做)。当然构造函数注入的缺点是类的实例化与参数绑定了,限制了实例化类的方式。
问题(3):构造函数中可以自动注入多个参数么?
1 public class ConstructorInjectDemo {
3 private Service service;
4 private HelloWorld helloWorld;
5 @Inject
6 public ConstructorInjectDemo(Service service,HelloWorld helloWorld) {
7 this.service=service;
8 this.helloWorld=helloWorld;
9 }
10 public Service getService() {
11 return service;
12 }
13 public HelloWorld getHelloWorld() {
14 return helloWorld;
15 }
16 public static void main(String[] args) {
17 ConstructorInjectDemo cid = Guice.createInjector().getInstance(ConstructorInjectDemo.class);
18 cid.getService().execute();
19 System.out.println(cid.getHelloWorld().sayHello());
20 }
21 }
22
23
非常完美的支持了多参数构造函数注入。当然了没有必要写多个@Inject,而且写了的话不能通过编译。
1.2.3 Setter注入(Setter Method Inject)
有了上面的基础我们再来看Setter注入就非常简单了,只不过在setter方法上增加一个@Inject注解而已。
1 public class SetterInjectDemo {
2
3 private Service service;
4
5 @Inject
6 public void setService(Service service) {
7 this.service = service;
8 }
9
10 public Service getService() {
11 return service;
12 }
13
14 public static void main(String[] args) {
15 SetterInjectDemo sid = Guice.createInjector().getInstance(SetterInjectDemo.class);
16 sid.getService().execute();
17 }
18
19 }
20
好了我们再回头看问题2的静态注入(static inject)。下面的例子演示了如何注入一个静态的字段。
1 /** a demo for static field inject
2 * @author Teny (www.teny32.blog.51cto.com)
3 * @version $Rev: 78 $
4 */
5 public class StaticFieldInjectDemo {
6
7 @Inject
8 private static Service service;
9
10 public static void main(String[] args) {
11 Guice.createInjector(new Module() {
12 @Override
13 public void configure(Binder binder) {
14 binder.requestStaticInjection(StaticFieldInjectDemo.class);
15 }
16 });
17 StaticFieldInjectDemo.service.execute();
18 }
19 }
20
21
非常棒!上面我们并没有使用Guice获取一个StaticFieldInjectDemo实例(废话),实际上static字段(属性)是类相关的,因此我们需要请求静态注入服务。但是一个好处是在外面看起来我们的服务没有Guice绑定,甚至client不知道(或者不关心)服务的注入过程。
再回到问题(1),参考上面静态注入的过程,我们可以使用下面的方式来注入实例变量的属性。
1 public class InstanceFieldInjectDemo {
2
3 @Inject
4 private Service service;
5 public static void main(String[] args) {
6 final InstanceFieldInjectDemo ifid = new InstanceFieldInjectDemo();
7 Guice.createInjector(new Module() {
8 @Override
9 public void configure(Binder binder) {
10 binder.requestInjection(ifid);
11 }
12 });
13 ifid.service.execute();
14 }
15 }
16
17
实际上这里有一种简便的方法来注入字段,实际上此方法也支持Setter注入。
1 public class InstanceFieldInjectDemo {
2
3 @Inject
4 private Service service;
5 public static void main(String[] args) {
6 InstanceFieldInjectDemo ifid = new InstanceFieldInjectDemo();
7 Guice.createInjector().injectMembers(ifid);
8 ifid.service.execute();
9 }
10 }
11
12
相关推荐
依赖注入(Dependency Injection,简称DI)是软件设计模式中的一种...在实际开发中,依赖注入不仅限于Spring框架,还有其他如Guice、PicoContainer等选择,但Spring因其强大的功能和广泛的应用而成为Java开发者的首选。
【标题】"nfsdb-guice-1.0.2.zip" 提供的是一个集成NFSDB(Network File System Database)与Guice框架的开源项目版本,版本号为1.0.2。NFSDB是一款高性能、分布式、内存化的数据库系统,常用于大数据实时处理场景。...
总结来说,这个基于Guice的HelloWorld项目旨在演示如何使用Guice框架进行依赖注入,以实现代码的松耦合。Guice提供了一种优雅的方式来管理对象及其依赖,使得代码更易于理解和测试。通过学习和实践这个项目,开发者...
雷·迪依赖注入框架 创建Ray.Di是为了在PHP项目中获得样式依赖项注入。 它试图反映Guice的行为和风格。概述Ray.Di软件包为依赖项注入器提供了以下功能: 构造器注入和二传手注入自动注射构造后初始化原始PHP工厂代码...
Guice Persist是Guice框架的一部分,用于提供依赖注入(DI)支持到持久化层,而这个项目则是将这种支持扩展到了 Neo4j。然而,需要注意的是,这个描述指出“此项目已弃用”,这意味着它可能不再被维护,可能存在安全...
书中通过大量的实例展示了如何有效地使用依赖注入技术,包括如何在Spring和Guice框架中实现依赖注入。例如,在介绍Warp Persist时,提到了它是如何为Guice提供了JPA集成和声明式事务支持的。这些具体的案例对于理解...
3. **DI框架**:讨论各种流行的DI框架,如Spring、Guice、 Autofac等,如何使用它们来实现DI,并对比分析各自的优缺点。 4. **最佳实践**:提供DI在实际项目中的应用指南,如何设计良好的接口,如何避免过度设计,...
首先,我们需要了解依赖注入(Dependency Injection,简称DI)的基本概念。依赖注入是一种设计模式,用于实现控制反转(Inversion of Control,简称IoC),使得对象间的依赖关系由系统中某个容器在运行期决定,而...
DI框架如Spring(Java)、 Autofac(.NET)和Guice(Java)等,为开发者提供了实现依赖注入的便捷方式。这些框架可以自动管理对象的生命周期,提供依赖解析,使得代码更加简洁和模块化。 书中可能涵盖了以下关键...
另外,Spring 3.1对JSR-330依赖注入规范的全面支持,使得与Google Guice等其他依赖注入框架的互操作性得到增强。 总的来说,这个"spring3.1 jar全集"包含的是一套完整的Spring开发工具,涵盖了从核心功能到高级特性...
- **依赖注入(DI)**:简化了组件间的依赖关系管理。 - **面向切面编程(AOP)**:增强了代码的模块化,使开发者能够分离关注点。 - **统一的数据访问抽象层**:简化了数据访问层的实现,提高了代码的可移植性...
2. **依赖注入(Dependency Injection, DI):** IoC的一个常见实现方式就是依赖注入,通过容器来管理和提供对象的依赖关系,而不是让对象自己去查找和创建依赖。 3. **IoC容器的作用:** IoC容器负责创建对象、...
在Java中,DI通常通过框架如Spring、Guice或 Dagger来实现。"DependencyInjectionsApplicationRepository" 指的是在应用中使用DI来管理数据访问层的对象,即仓库(Repository)。 仓库是面向对象设计中的一种模式,...
7. **JSR-330标准支持**:Spring 2.0引入了对JSR-330(依赖注入API)的支持,使得与其他遵循该标准的框架(如Guice)的集成变得更加容易。 8. **MVC注解**:Spring 2.0引入了注解驱动的MVC,例如`@RequestMapping`...
JBoss Microcontainer的组件模型支持高级依赖注入(Dependency Injection, DI)和控制反转(Inversion of Control, IoC)。DI和IoC是现代Java应用程序设计的重要原则,它们允许对象之间的依赖关系被外部化,提高代码...
Picocontainer是一个轻量级的依赖注入框架,它在Java世界中扮演着重要角色,特别是在简化应用程序组件的组装和管理方面。这个框架以其小巧、快速和易于理解的特点而受到开发者的青睐。在本文中,我们将深入探讨...
1. **准备库文件**:DWR的核心引擎dwr.jar,以及日志、XML解析、多线程、script构造器、DI框架等支持库,例如commons-logging、xalan、backport-util-concurrent、bsf、xml-apis、dom4j、jdom、xom、guice-servlet、...
6. **依赖注入**:JSF与Java EE的依赖注入(DI)机制兼容,可以利用JSR 330(如Guice)或JSR 346(如CDI)进行组件的管理和注入。 7. **Mojarra和MyFaces**:JSF有两个主要的开源实现,分别是Oracle主导的Mojarra和...
2. **依赖注入(Dependency Injection)**:通过JSR 330规范的实现,例如Google的Guice或Spring框架,Java EE 6引入了依赖注入(DI),这使得对象之间的关系可以通过容器管理,降低了代码间的耦合度。 3. **统一...