泽西岛:如何访问全局应用程序对象



我正在使用Java,Tomcat和Jersey创建REST Web应用程序。我正在使用注释(没有web.xml!)我最终使用了此应用程序配置:

package com.my_own.server;
import java.util.Properties;
import javax.ws.rs.ApplicationPath;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.my_own.db.PostgreSQLDb;
@ApplicationPath("/api")
public class Application extends javax.ws.rs.core.Application {
    private static Logger logger = LogManager.getLogger(Application.class);
    public static Application application = null;
    public final Properties properties;
    public final PostgreSQLDb adminDb;
    public Application() throws Exception {
        logger.debug("Loading properties from ",
                    getClass().getClassLoader().getResource("config.properties"));
        properties = new Properties();
        properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));
        adminDb = new PostgreSQLDb(properties, "admin");
        application = this; // Setting the global application object here
    }
}

这是我的问题。Web容器有一个全局应用对象。我将其从应用程序构造函数中保存到静态字段中。我需要以后从其他类访问它(它拥有全局配置,全局数据库连接工厂以及可能的其他内容。)

我在做这件事吗?我怀疑必须有一种更好的方法:处理注释后,保存对应用程序的引用。但是我不确定如何。我可以确定该应用程序的构造函数将被精确调用一次,并且应用程序可以从任何REST调用中访问应用程序?

在泽西岛使用依赖注入,在初始化时绑定您的应用程序:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        super(MyApplication.class);
        register(new MyBinder());
        packages(true, "location.of.my.jersey.classes");
    }
    /* Bind is used to let jersey know what can be injected */
    private static class MyBinder extends AbstractBinder {
        @Override
        protected void configure() {
            bind(MyApplication.class).to(MyApplication.class);
        }
    }
}

然后在您的代码中:

@Path("myapi")
@Produces(MediaType.APPLICATION_JSON)
public class ServerRoutes {
    @Inject
    MyApplication application;
//... your rest code here
}

现在,您可以在代码中访问MyApplication,而无需任何静态或单例,Jersey处理它。

让我分享我的意见:当然,您可以使用众所周知的单身模式来存储"全局"静态对象,但是,这几天确实是一个反图。

如果不是家庭作业或其他东西,则存储全局"静态"对象总是一个坏主意。如果您想知道为什么有很多消息来源回答这个问题,例如这个讨论,例如

因此,我建议考虑使用依赖项注入容器,那里有很多非常好的容器:春季,Guice等着。

这些容器可以将这些对象存储为bean,如果您的"功能"也由这些容器管理,您将可以直接"注入"应用程序bean。

它有效地解决了Singleton模式引入的所有问题。

相关内容

  • 没有找到相关文章

最新更新