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为不同的实例。