当前位置: 首页 > 面试题库 >

AnnotationConfigApplicationContext和父上下文

严瑞
2023-03-14
问题内容

我在尝试使用定义上下文层次结构时遇到问题AnnotationConfigApplicationContext

问题是在内部定义模块上下文beanRefContext.xml并使用另一个上下文(基于XML / Annotated)设置’parent’属性时。

例:

模块A中的beanRefContext.xml

<bean id =“ moduleA_ApplicationContext”  
      class =“ org.springframework.context.support.ClassPathXmlApplicationContext”>
    <property name =“ configLocations”>
        <列表>
            <value> classpath:db-context.xml </ value>
        </ list>
    </ property>
</ bean>

db-context.xml

<bean id =“ dataSource” 
      class =“ org.apache.commons.dbcp.BasicDataSource” 
      destroy-method =“ close”
      p:driverClassName =“ org.h2.Driver”
      p:url =“ jdbc:h2:mem:testdb; DB_CLOSE_DELAY = -1; MODE = MySQL; TRACE_LEVEL_SYSTEM_OUT = 2” />

<!-休眠会话工厂->
<bean name =“ sessionFactory” 
      class =“ org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>
        <property name =“ dataSource” ref =“ dataSource” />
        <property name =“ useTransactionAwareDataSource” value =“ true” />
        <property name =“ packagesToScan”>
            <列表>
                <value> com.example.model </ value>
            </ list>
        </ property>
        <property name =“ hibernateProperties”>
        <!-冬眠道具->
        </ property>
</ bean>

模块B中的beanRefContext.xml

<bean id =“ moduleB_ApplicationContext” 
      class =“ org.springframework.context.annotation.AnnotationConfigApplicationContext”>
    <property name =“ parent” ref =“ moduleA_ApplicationContext” />
        <constructor-arg>
            <列表>
                <value> com.example.dao </ value>
            </ list>
        </ constructor-arg>
</ bean>

冬眠道

FooHibernateDao类实现FooDao {
    @Autowired
    @Qualifier(“ sessionFactory”)
    私有SessionFactory sessionFactory;

    // CRUD方法
}

模块B应用程序上下文无法找到在模块A应用程序上下文中定义的bean。
从代码AnnotationConfigApplicationContext看,扫描过程似乎没有使用父对象作为解析bean的参考。

我有做错什么吗,或者使用注释配置无法创建层次结构?


问题答案:

问题源于AnnotationConfigApplicationContext的构造函数进行扫描的事实。因此,父级不是在此阶段设置的,它仅在扫描完成后才设置,因为父级是由属性设置的-
因此它找不到您的bean的原因。

缺省的AnnotationConfigApplicationContext Bean没有采用父工厂的构造函数-不知道为什么。

您可以使用基于xml的常规应用程序上下文并在其中配置注释扫描,也可以创建一个自定义虚构bean来创建注释应用程序上下文。这将指定父引用,然后进行扫描。

看一下来源…

工厂看起来像这样:

public class AnnotationContextFactory implements FactoryBean<ApplicationContext> {

private String[] packages;
private ApplicationContext parent;

@Override
public ApplicationContext getObject() throws Exception {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    context.setParent(parent);
    context.scan(packages);
    context.refresh();
    return context;
}

@Override
public Class<ApplicationContext> getObjectType() {
    return ApplicationContext.class;
}

@Override
public boolean isSingleton() {
    return true;
}

public void setPackages(String... args) {
    this.packages = args;
}

public void setParent(ApplicationContext parent) {
    this.parent = parent;
    }
}

和您的bean定义:

<bean id="moduleB_ApplicationContext" class="za.co.test2.AnnotationContextFactory">
    <property name="parent" ref="moduleA_ApplicationContext" />
    <property name="packages">
        <list>
            <value>za.co.test2</value>
        </list>
    </property>
</bean>


 类似资料:
  • 问题内容: 我有一个Spring bean(dao)对象,该对象通过以下xml在ServletContext中实例化: 该bean在我的webapp-servlet.xml文件中声明,并由我的应用程序在ServletContext中使用。 我也在使用SpringSecurity。据我了解,这在不同的上下文(SecurityContext)中运行。 我的应用程序具有webapp-security.x

  • 我有一个使用子/父上下文关系的Spring应用程序。这样做的原因是为了确保子上下文从父上下文继承bean/资源,然后根据需要添加更多bean/资源来覆盖它们。但是,当子上下文关闭时(退出try/catch作用域),它开始对它引用的所有bean进行清理,包括父作用域中的bean。这是不可取的,因为我需要重用父上下文来创建另一个子上下文,但是现在它是垃圾,因为它包含了一堆已处理/关闭的bean。 问题

  • 我在下面创建了AppConfig.java,没有@configuration注释。 将这个类作为我的java配置类传递给,它接受并注册了我的服务bean。 我对上面相同的AppConfig做了一些修改,如下所示。

  • 我有一个关于Spring的ApplicationListener在父上下文和子上下文方面的性质的问题。假设您创建了一个父上下文,它创建了一个bean,该bean是一个单例,并注册为ApplicationListener。然后,使用父上下文创建子上下文。关闭子上下文时,Spring将发送ContextClosedEvent。该事件是否也会传播到父上下文,从而导致作为ApplicationListen

  • 我将Spring Boot与Spring集成在一起,我希望为每个<code>child() 此时此刻,我正在处理这个:(只有最相关的行) 我已经查看了SpringApplication ationBuilder方法,并且属性从父亲传播到孩子: 但是我需要动态加载一些属性,如下例所示: 从此示例中提取:Spring多个 imapAdapter 这是因为一些Spring集成组件将从配置文件中动态加载。

  • 我有两个类(实际上是一个基类和许多其他类)。我希望获得子类中的父上下文,而不必每次都填充回< code>super()。它的基本目标是把我的角分量分成多个类。我会试着做一个例子 如您所见,我无法检索<code>这个。canvas并使用它,是否有任何解决方法。我知道我可以将画布传递到方法中,但我更希望像组件中一样使用<code>this<code>关键字来访问全局上下文。 所以基本上我想做的是: 任