启动和运行
然后实际运用中
这样就完成了一次注入
Module里的configure方法是必须实现的 所有的绑定都是在这里定义的 怎么绑定都是可以自己diy的
Guice 的启动有两种模式
一是开发阶段模式
一是产品阶段模式
在开发阶段,Guice 会 根据需要加载单件对象。这样,你的应用 程序可以快速启动,只加载你正在测试的部分。
在产品阶段,Guice 会在启动时加载全部单件对象。这帮助你尽早捕获错误,提前优化性能。
使用方法
' stage可以使用
有时候并不是想注入一个实例 想在需要的时候再去获取 就可以注入一个Provider
只要是实现Provider接口的类 来实现提供需要的类
应用场景在那些特定的环境里 我们的业务代码依赖于其他容器或者运行状态中的实例 就需要在运行中才能注入 此时就需要自己实现一个提供者(Provider)来获取环境中实例 那么在业务代码中来注入这个Provider就可以了
注意写法 这个自定义的类要 implements Provider<T>
例如
绑定时
然后在需要的时候调用 Provider<T> .get()方法来获取实例
' configure方法里可以用install来安装别的Module的
......
比如
' Injector的getInstance(
API里写到等价于
' 尽早的加载一个单体对象 它会自动把此类的依赖进行注入 只要在此类关联依赖包括依赖的依赖循环的依赖都会进行注入
' java 的class不能描述泛型 google提供了一个TypeLiteral
所以可以进行以下这样的绑定
'
绑定自己本身为一个实例
bind(ManagedFilterPipeline.class)
.toInstance(new ManagedFilterPipeline(filterDefinitions));
使用的时候
injector.getInstance(ManagedFilterPipeline.class)
.initPipeline(servletContext, injector);
' 注入非接口实现类的 必须有一个构造函数有@Inject标记 要么就不要构造函数
例子
不能写成这样
- 首先创建你的模块类实例,并将其传入 Guice.createInjector().
- Guice 创建一个绑定器 Binder 并将其传入你的模块。
- 你的模块使用绑定器来定义绑定。
- 基于你所定义的绑定,Guice 创建一个注入器 Injector 并将其返回给你。
- 你使用注入器来注入对象。
- public class MyModule implements Module {
- public void configure(Binder binder) {
- binder.bind(IMyService.class)
- .to(MyServiceImp.class)
- .in(Scopes.SINGLETON);
- }
- }
然后实际运用中
- MyApp app = new MyApp();
- Module module = new MyModule();
- Injector in = Guice.createInjector(module);
- in.injectMembers(app);
这样就完成了一次注入
Module里的configure方法是必须实现的 所有的绑定都是在这里定义的 怎么绑定都是可以自己diy的
Guice 的启动有两种模式
一是开发阶段模式
一是产品阶段模式
在开发阶段,Guice 会 根据需要加载单件对象。这样,你的应用 程序可以快速启动,只加载你正在测试的部分。
在产品阶段,Guice 会在启动时加载全部单件对象。这帮助你尽早捕获错误,提前优化性能。
使用方法
createInjector(Stage stage, Module... modules)
' stage可以使用
Stage.DEVELOPMENT和Stage.PRODUCTION' 注入提供者
后者将会在初始化的时期就早期进行注入
前者在用到时方会进行注入
- public class MyModule implements Module {
- public void configure(Binder binder) {
- // Bind Foo to FooImpl. Guice will create a new
- // instance of FooImpl for every injection.
- binder.bind(Foo.class).to(FooImpl.class);
- //绑定实例
- // Bind Bar to an instance of Bar.
- Bar bar = new Bar();
- binder.bind(Bar.class).toInstance(bar);
- }
- }
有时候并不是想注入一个实例 想在需要的时候再去获取 就可以注入一个Provider
只要是实现Provider接口的类 来实现提供需要的类
应用场景在那些特定的环境里 我们的业务代码依赖于其他容器或者运行状态中的实例 就需要在运行中才能注入 此时就需要自己实现一个提供者(Provider)来获取环境中实例 那么在业务代码中来注入这个Provider就可以了
注意写法 这个自定义的类要 implements Provider<T>
例如
- class ServletContextProvider implements Provider<ServletContext> {
- public ServletContext get() {
- return ContextManager.getServletContext();
- }
- }
绑定时
- bind(ServletContext.class).toProvider(ServletContextProvider.class);
然后在需要的时候调用 Provider<T> .get()方法来获取实例
' configure方法里可以用install来安装别的Module的
......
比如
- protected void configure() {
- //install preceeding module(s)
- install(new WebModule());
- install(filtersModule);
- //bind these servlet definitions to a singleton pipeline
- bind(ManagedServletPipeline.class)
- .toInstance(new ManagedServletPipeline(servletDefinitions));
- }
' Injector的getInstance(
type
)将会返回一个泛型的实例
API里写到等价于
getProvider(type).get()
' 尽早的加载一个单体对象 它会自动把此类的依赖进行注入 只要在此类关联依赖包括依赖的依赖循环的依赖都会进行注入
- bind(xxx.class).asEageSingleton();
' java 的class不能描述泛型 google提供了一个TypeLiteral
所以可以进行以下这样的绑定
- bind(new TypeLiteral<Set<Package>>(){}).toInstance(Collections.unmodifiableSet(new LinkedHashSet<Package>(packages)));
bind(ManagedFilterPipeline.class)
.toInstance(new ManagedFilterPipeline(filterDefinitions));
使用的时候
injector.getInstance(ManagedFilterPipeline.class)
.initPipeline(servletContext, injector);
' 注入非接口实现类的 必须有一个构造函数有@Inject标记 要么就不要构造函数
例子
- package com.ergal.ezweb.core;
- import static com.google.inject.matcher.Matchers.annotatedWith;
- import java.util.LinkedHashSet;
- import java.util.Set;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import com.ergal.ezweb.annotation.ViewHtml;
- import com.ergal.ezweb.annotation.ViewPath;
- import com.ergal.ezweb.utils.ClassUtil;
- import com.google.inject.Inject;
- import com.google.inject.Provider;
- import com.google.inject.matcher.Matcher;
- /**
- * 提供pagedesign的Provider
- * @author <a href="mailto:ohergal@gmail.com">ohergal</a>
- *
- */
- public class PageDesignPaperBuilder implements Provider<Set<PageDesignPaper>>{
- private static final Log log = LogFactory.getLog(PageDesignPaperBuilder.class);
- //符合视图annotation的匹配器定义
- final Matcher<? super Class<?>> matcher = annotatedWith(ViewHtml.class).or(annotatedWith(ViewPath.class));
- //只取视图类 所以重新定义一个集合
- Set<Class<?>> pageClasses = new LinkedHashSet<Class<?>>();
- private Set<Package> packages; //需要注入的包含所有视图的包
- @Inject
- public PageDesignPaperBuilder(Set<Package> packages){
- this.packages = packages;
- }
- public Set<Package> getPackages() {
- return packages;
- }
- public void setPackages(Set<Package> packages) {
- this.packages = packages;
- }
- public Set<PageDesignPaper> get(){
- //实现返回一个PageDesignPaper的集合
- return null;
- }
- /**
- * 取出所有的类 如果是视图page类 就组装一个PageDesignPaper的集合
- */
- public PageDesignPaperBuilder install(){
- //循环这个package的集合
- log.info("******************** 开始扫描用户定义的视图类 ********************");
- for(Package pack : packages){
- //获取到所有的视图类
- Set<Class<?>> classes = ClassUtil.getClasses(pack);
- //循环所有类
- for(Class<?> clazz : classes){
- if(matcher.matches(clazz)){
- //如果有视图定义的一些annotation 就添加到视图集合中
- pageClasses.add(clazz);
- log.info("添加自定义视图类: "+clazz.getName());
- }
- }
- }
- log.info("******************** 扫描用户定义的视图类结束 ********************");
- return this;
- }
- }
不能写成这样
- package com.ergal.ezweb.core;
- import static com.google.inject.matcher.Matchers.annotatedWith;
- import java.util.LinkedHashSet;
- import java.util.Set;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import com.ergal.ezweb.annotation.ViewHtml;
- import com.ergal.ezweb.annotation.ViewPath;
- import com.ergal.ezweb.utils.ClassUtil;
- import com.google.inject.Inject;
- import com.google.inject.Provider;
- import com.google.inject.matcher.Matcher;
- /**
- * 提供pagedesign的Provider
- * @author <a href="mailto:ohergal@gmail.com">ohergal</a>
- *
- */
- public class PageDesignPaperBuilder implements Provider<Set<PageDesignPaper>>{
- private static final Log log = LogFactory.getLog(PageDesignPaperBuilder.class);
- //符合视图annotation的匹配器定义
- final Matcher<? super Class<?>> matcher = annotatedWith(ViewHtml.class).or(annotatedWith(ViewPath.class));
- //只取视图类 所以重新定义一个集合
- Set<Class<?>> pageClasses = new LinkedHashSet<Class<?>>();
- @Inject
- private Set<Package> packages; //需要注入的包含所有视图的包
- public PageDesignPaperBuilder(Set<Package> packages){
- this.packages = packages;
- }
- public Set<Package> getPackages() {
- return packages;
- }
- public void setPackages(Set<Package> packages) {
- this.packages = packages;
- }
- public Set<PageDesignPaper> get(){
- //实现返回一个PageDesignPaper的集合
- return null;
- }
- /**
- * 取出所有的类 如果是视图page类 就组装一个PageDesignPaper的集合
- */
- public PageDesignPaperBuilder install(){
- //循环这个package的集合
- log.info("******************** 开始扫描用户定义的视图类 ********************");
- for(Package pack : packages){
- //获取到所有的视图类
- Set<Class<?>> classes = ClassUtil.getClasses(pack);
- //循环所有类
- for(Class<?> clazz : classes){
- if(matcher.matches(clazz)){
- //如果有视图定义的一些annotation 就添加到视图集合中
- pageClasses.add(clazz);
- log.info("添加自定义视图类: "+clazz.getName());
- }
- }
- }
- log.info("******************** 扫描用户定义的视图类结束 ********************");
- return this;
- }
- }