Java/JPA class 用于存储应用程序设置

Java/JPA class for storing application settings

如何使用 JPA 为我的 Java Servlet 应用程序创建 Settings class?我在想像静态 class 和 key/value 对的映射之类的东西,用于存储应用程序设置,如电子邮件服务器地址等。像这样的东西:

public class ApplicationSettings {

    private static Map<String, String> settings;

对于基于 Spring 的应用程序

您可以使用缓存来存储数据库中的属性。您可以使用 @Cacheable("properties") 调用数据库服务并将其加载到缓存中。如果您想更新、删除或添加新的 属性,您可以使用 @CacheEvict(value = "properties", allEntries = true),您可以在其中调用数据库服务来执行实际操作。 @CacheEvict 将清除为 properties 键映射的所有现有缓存,并通过隐式调用 @Cacheable("properties") 加载新属性

@Repository
public class ApplicationSettings {

    private DatabaseService databaseService;

    public ApplicationSettings(DatabaseService databaseService) {
        this.databaseService = databaseService;
    }

    @Cacheable("properties")
    public Map<String, String> getAppProperties() {
        return databaseService.getAppProperties();
    }

    @CacheEvict(value = "properties", allEntries = true)
    public void updateAppProperties(String key, String value) throws IOException {
        databaseService.updateAppProperties(key, value);
    }
}

您现在可以在任何需要

等属性的地方使用 ApplicationSettings
@Autowired
private ApplicationSettings applicationSettings;

:
:
Map<String, String> appProperties = applicationSettings.getAppProperties();

对于基于 Servlet 的应用程序

您可以使用 EhCache 或简单地使用 Sevlet Listener 来实现上述场景

在web.xml

<web-app ....>
  <listener>
    <listener-class>
    com.listernerpackage.ApplicationInitializationListener
    </listener-class>
  </listener>
:

创建一个 ServletContextListener

public class ApplicationInitializationListener implements ServletContextListener {    
    @Override
    public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();
        Map<String, String> properties = someDbManager.getAppProperties(); 
        context.setAttribute("properties", properties );           
    }
}

您可以通过调用

来检索 servlet 中的属性
Map<String, String> properties = (Map<String, String>) this.getContext().getAttribute("properties");