Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:确保首先初始化特定的bean_Java_Spring - Fatal编程技术网

Java Spring:确保首先初始化特定的bean

Java Spring:确保首先初始化特定的bean,java,spring,Java,Spring,我有一个库在运行时设置和配置log4j(没有log4j.properties或log4j.xml)。我已经用名为MyLoggerFactory的类定义了一个bean,我希望这是第一个使用spring初始化的bean。我已经看到一个问题已经向spring提交,以支持初始化顺序,但我想知道是否有一种方法可以将一个bean标记为spring容器初始化的第一个bean?这是一个请求但未解决的功能。您可以使用dependens,但它太冗长了。有关更多信息,请访问tis链接: 您的选择包括: 使用annot

我有一个库在运行时设置和配置log4j(没有log4j.properties或log4j.xml)。我已经用名为MyLoggerFactory的类定义了一个bean,我希望这是第一个使用spring初始化的bean。我已经看到一个问题已经向spring提交,以支持初始化顺序,但我想知道是否有一种方法可以将一个bean标记为spring容器初始化的第一个bean?

这是一个请求但未解决的功能。您可以使用dependens,但它太冗长了。有关更多信息,请访问tis链接: 您的选择包括:

  • 使用annotation(Spring3.0.x之后可用)或xml属性,并使所有使用已配置记录器的类依赖于记录器工厂
  • 使工厂成为记录器的实际工厂,并将记录器注入bean中,而不是直接调用工厂——这与选项1基本相同,只是暗示了依赖关系。这是我推荐的选择
  • 将初始化代码移动到指定调用顺序的代码部分–在初始化Spring之前注册的
    main()
    方法或
    ServletContextListener

  • 在Spring中无法明确定义初始化顺序,而且可能永远也无法明确定义——考虑到您可以加载许多可能有冲突顺序的应用程序上下文配置文件,因此无法为其定义有用的语义。我还没有看到通过重构代码以更好地符合依赖注入模式而无法实现所需排序的情况。

    您可以在主@Configuration中@Autowired一个@Configuration

    @Configuration
    @Import(BusinessConfig.class, EarlyBeans.class)
    public class MainConfiguration {
    
        // The bean defined in EarlyBean will be loaded before 
        // most beans references by MainConfiguration, 
        // including those coming from BusinessConfig
        @Autowired
        EarlyBeans earlyBeans;
    
    }
    
    @Configuration
    public class EarlyBeans {
        @Bean
        public Void earlyBean(ApplicationContext appContext) {
            // .getBeansOfType allows to call for beans which might not exist
            appContext.getBeansOfType(TechnicalBean.class);
    
            return null;
        }
    
    }
    

    您可以将应用程序上下文拆分为多个,并在主应用程序上下文中使用导入。您可以先按导入顺序放置主环境设置,然后继续添加其他文件

    它可能像下面这样

    <!-- Import environment properties settings. -->
    <import resource="Spring-Env.xml"/>
    <!-- Import All the other Application contexts. -->
    <import resource="Spring-MainApplicationContext.xml"/>
    
    
    
    看看这篇文章,您可能希望无论如何都包括log4j.properties,至少对于Spring启动,在Spring初始化您的日志bean之前,它将使用其内部日志记录的默认值,通常,如果您使用的是log4j,这将是在类路径上定义的log4j.properties文件。这个文件不必非常复杂-通常它可以简单地输出到控制台,因为如果应用程序成功启动,有意义的日志记录将通过您的自定义bean进行。我在某种程度上实现了第三个选项,但这意味着我首先在spring之外显式初始化logger。我的偏好是让大多数对象的生命周期由spring管理,但我理解你的观点,即一个好的设计模式应该能够处理它。@Prasanna如果你想让大多数对象由spring管理,你肯定也应该在spring中管理记录器,或者将记录器创建封装在记录器工厂中,并将其注入到其他类中。如果您想支持使用
    LogManager
    静态方法检索记录器,那么您必须使用选项3–因为LogManager是一个(专门的)对象工厂,不能由Spring合理管理。@Inerida,是的,LogManager是问题所在,我没有看到除3之外的任何其他选项,我使用
    @DependsOn({“anotherBean”})
    @prayagupd-你是我们所有人的英雄,因此你的努力会更好。你根本不需要我的许可,我想问一下会减少我回家时忘记它的风险非常有用,只有一条评论-一条@Import(EarlyBeans.class)或者@Autowired EarlyBeans EarlyBeans;就足以让它工作了。很抱歉评论了一个老问题-这与调用
    appContext.getBeansOfType(TechnicalBean.class)
    或者在主配置本身内部使用
    @Autowired TechnicalBean
    有何不同?