我在尝试使用定义上下文层次结构时遇到问题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>关键字来访问全局上下文。 所以基本上我想做的是: 任