[ https://issues.apache.org/jira/browse/LOG4J2-3496?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17532861#comment-17532861 ]
Volkan Yazici commented on LOG4J2-3496: --------------------------------------- {quote}I don't see how the injection system can be used with PatternLayout{quote} Imagine how you would do this if it would have been a Spring application. In the current situation, {{PatternLayout}} creates a {{PatternParser}} which internally collects {{PatternConverter}}'s via direct call to {{PluginManager}}. With the proposed enhancement, {{PatternLayout}} builder accepts a {{PatternParserFactory}} instead and that {{PatternParserFactory}} has a builder containing a field of type {{Map<String, PatternConverter>}}. Here the plugin infra populates {{PatternConverter}}'s, uses it to create a new {{PatternParserFactory}}, and uses it to create a {{PatternLayout}}. {quote}PatternParser runs through all the PatternConverter plugins and adds them to a Map with the pattern converter symbol as the key and the converter Class as the value. It then parses the pattern and creates a list of PatternConverters in the order they are specified in the input.{quote} Exactly and there is no way of changing this behavior, since it is hardcoded. That is whole point of inversion-of-control (IoC) Ralph, right? You separate the concerns of constructing objects and using them. {quote}If all you are thinking of doing is the mapping from the plugins into the Map of keys to converters, well ok. But I don't see a huge amount of value in that.{quote} The whole point of this practicing IoC throughout the entire code base, whenever necessary. I am not telling every single spot using {{Instant.now()}} should be first injected an {{Instant}} and use that. All I am saying is plugins are there for IoC and should be used with that in mind. If random components circumvent the plugin mechanism and indirectly access to that... It is like a Spring bean creating its own {{ApplicationContext}} and using it to populate its own dependencies. I don't know how else to make this more clear. > Support injection via container types > ------------------------------------- > > Key: LOG4J2-3496 > URL: https://issues.apache.org/jira/browse/LOG4J2-3496 > Project: Log4j 2 > Issue Type: New Feature > Components: Plugins > Reporter: Volkan Yazici > Assignee: Matt Sicker > Priority: Major > Fix For: 3.0.0 > > > Plugin system should support the injection via container types. Since this is > not currently the case, whenever a, for instance, collection of plugins need > to be injected (e.g., Pattern and JSON Template Layouts), ad-hoc access to > {{PluginManager}} or {{PluginUtils}} is needed. This approach has certain > drawbacks: > * Duplication of ad-hoc code > * Not aligned with the way plugins are loaded, that is, via {{@Inject}} > * Impossible to test > h3. Container types > Ideally, the plugin system should support injection via the following > container types: > * {{Optional<P>}} > * {{Collection<P>}} > * {{Iterable<P>}} > * {{Set<P>}} > * {{Stream<P>}} > * {{List<P>}} > * {{Map<N, P>}} > Above {{P}} denotes the type the plugin is assignable from and {{N}} denotes > the plugin name. > h3. Ordering problem > A {{@PluginOrder}} annotation needs to be introduced to address the following > corner cases: > * In the case of {{Optional<P>}}, if there are multiple matches, the first > one needs to be picked. > * In the case of collection and map types, elements need to be sorted. > Sorting can be done in the following way: > * If one or more of the matches are annotated with {{@PluginOrder}}, they > will have the precedence and get sorted according to {{@PluginOrder}} values. > * The rest will be sorted according to their discovery order. > The order in collection types can be preserved using the following > implementations: > * {{Set}} -> {{LinkedHashSet}} > * {{Map}} -> {{LinkedHashMap}} > * {{Collection}}, {{Iterable}}, {{Stream}} -> {{List}} -- This message was sent by Atlassian Jira (v8.20.7#820007)