Biv*_*vas 4 java spring annotations
我正试图用一个问题来定义一个上下文层次结构AnnotationConfigApplicationContext.
问题是在内部定义模块上下文beanRefContext.xml并使用另一个上下文(基于XML/Annotated)设置'parent'属性.
例:
模块A中的beanRefContext.xml
<bean id="moduleA_ApplicationContext"
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<property name="configLocations">
<list>
<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"/>
<!-- Hibernate Session Factory -->
<bean name="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="useTransactionAwareDataSource" value="true"/>
<property name="packagesToScan">
<list>
<value>com.example.model</value>
</list>
</property>
<property name="hibernateProperties">
<!-- hibernate props -->
</property>
</bean>
模块B中的beanRefContext.xml
<bean id="moduleB_ApplicationContext"
class="org.springframework.context.annotation.AnnotationConfigApplicationContext" >
<property name="parent" ref="moduleA_ApplicationContext"/>
<constructor-arg>
<list>
<value>com.example.dao</value>
</list>
</constructor-arg>
</bean>
FooHibernateDao
class FooHibernateDao implements FooDao {
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionsFactory;
// CRUD methods
}
模块B应用程序上下文无法找到模块A应用程序上下文中定义的bean.
从查看代码AnnotationConfigApplicationContext看来,扫描过程似乎不使用父作为解析bean的参考.
有什么我做错了或者我的注释配置是不可能尝试创建层次结构?
问题源于AnnotationConfigApplicationContext的构造函数执行扫描的事实.因此,父级未设置在此阶段,仅在扫描完成后设置,因为父级由属性设置 - 因此它找不到您的bean的原因.
默认的AnnotationConfigApplicationContext bean没有构建器来获取父工厂 - 不知道为什么.
您可以使用常规的基于xml的应用程序上下文并在其中配置注释扫描,也可以创建一个自定义的fatory 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;
}
}
Run Code Online (Sandbox Code Playgroud)
你的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>
Run Code Online (Sandbox Code Playgroud)