Google Guice提供了一个名为@Singleton的注解,只要在类上加上这个注解,就可以实现一个单例类,不需要自己手动编写单例实现类。@Named注解提供了为属性赋值的功能。
一。Scope
package com.template.juice; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-8-5 * Time: 下午8:26 */ public enum Scope { REQUEST, SESSION, GLOBAL, UNSCOPE }
二。Database
package com.template.juice; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-8-5 * Time: 下午8:33 */ @Singleton public class Database { @Named("driverClassName") @Inject private String driverClassName; @Named("url") @Inject private String url; @Named("username") @Inject private String username; @Named("password") @Inject private String password; /** * Just for test and study,it does not make sense. */ @Named("scope") @Inject private Scope scope; public String driverClassName() { return driverClassName; } public String url() { return url; } public String username() { return username; } public String password() { return password; } public Scope scope() { return scope; } }
三。DatabaseModule
package com.template.juice; import com.google.inject.AbstractModule; import com.google.inject.name.Names; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-8-5 * Time: 下午8:38 */ public class DatabaseModule extends AbstractModule { @Override protected void configure() { bind(String.class).annotatedWith(Names.named("driverClassName")).toInstance("com.mysql.jdbc.Driver"); bind(String.class).annotatedWith(Names.named("url")).toInstance("jdbc:mysql://localhost:3306/demo"); bind(String.class).annotatedWith(Names.named("username")).toInstance("root"); bind(String.class).annotatedWith(Names.named("password")).toInstance("root"); bind(Scope.class).annotatedWith(Names.named("scope")).toInstance(Scope.GLOBAL); } }
四。Main
package com.template.juice; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-8-5 * Time: 下午8:42 */ public class Main { private static Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) { Module module = new DatabaseModule(); Injector injector = Guice.createInjector(module); Database instance1 = injector.getInstance(Database.class); Database instance2 = injector.getInstance(Database.class); logger.info("driverClassName is " + instance1.driverClassName()); logger.info("url is " + instance1.url()); logger.info("username is " + instance1.username()); logger.info("password is " + instance1.password()); Boolean isSingleton = instance1.equals(instance2); logger.info(instance1.toString()); logger.info(instance2.toString()); logger.info(isSingleton.toString()); } }
五。运行结果
可以看到instance1和instance2的hashcode相同,并且两者相比为true,说明injector返回的是同一个实例。
去除Database类的@Singleton注解,运行结果为
可以看到去除@Singleton注解后,instance1和instance2的hashcode不同,并且两者相比为false,说明instance1和instance2为不同的实例。