Matt Sicker created LOG4J2-2803:
-----------------------------------

             Summary: Create standardized scopes and dependency injection API
                 Key: LOG4J2-2803
                 URL: https://issues.apache.org/jira/browse/LOG4J2-2803
             Project: Log4j 2
          Issue Type: Epic
          Components: Configuration, Core, Plugins
            Reporter: Matt Sicker
            Assignee: Matt Sicker
             Fix For: 3.0.0


In Log4j 2.x, the plugin API provides several {{@Plugin}} annotations which are 
used for performing dependency injection of configuration-scoped data (plugin 
attributes, values) and other configuration-scoped plugins (plugin elements). 
While this API works well enough for a large majority of our use cases, the 
remaining injection points include the {{Node}} and {{Configuration}} 
corresponding to the currently parsed node and configuration respectively which 
are used to perform manual lookups and other glue code that would be more 
appropriately modeled through inversion of control with a more complete 
dependency injection API.

In Log4j 3.0, this epic introduces a new plugin system API inspired by 
[CDI|https://docs.jboss.org/cdi/api/2.0/], 
[@Inject|https://docs.oracle.com/javaee/6/api/javax/inject/Inject.html], and 
[Guice|https://github.com/google/guice] that maintains full backward 
compatibility with the annotations from 2.x so that plugins do not need to be 
needlessly rewritten for 3.x. This epic was initially developed as a result of 
work done in LOG4J2-2694.

Beyond the dependency injection API itself, this epic is motivated by the 
following goals:
 * Simplify plugin classes that currently require manual method calls to 
{{Configuration}} or {{Node}}.
 * Unify the various ad hoc dependency injection for configuration-scoped or 
singleton-scoped classes (the latter which are overridden via system 
properties) including:
 ** {{StrSubstitutor}}
 ** {{ConfigurationScheduler}} (or scheduled tasks in general)
 ** {{ScriptManager}}
 ** {{WatchManager}}
 ** {{NanoClock}}
 ** {{ShutdownCallbackRegistry}}
 ** {{Clock}}
 ** {{ContextSelector}}
 ** {{ConfigurationFactory}}{{}}
 ** {{LogEventFactory}}
 ** {{ContextDataFactory}}
 * Make dependencies between classes more explicit via inversion of control 
which allows for easier testing and modularity.
 * Avoid the use of manual configuration handling at the API level of any 
plugins including basic string parsing (as currently supported through the 
{{TypeConverter}} API), class loading from strings, and ad hoc reflection. This 
relates to the changes made in LOG4J2-2621 and LOG4J2-1917.
 * Provide smart initialization logic to continue (or maintain) improvements to 
startup time and avoid loading plugins that aren't referenced in the loaded 
configuration.
 * Provide scopes for other ad hoc scopes/contexts used in various plugins such 
as HTTP request, HTTP session, servlet context, etc.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to