我以编程方式设置了应用程序配置,我正在导入这样的bean:
@Configuration
@ImportResource( value= { "classpath:myBean.xml"})
public class AppConfig extends WebMvcConfigurerAdapter
{
在myBean.xml
我有这个:
<bean id="myBeanId" class="my.domain.myBeanClass">
<property name="sessionFactory" ref="my_session_factory" />
<property name="someOtherProperty"...
</bean>
此工作正常,sessionFactory
注入了myBeanClass
。
但是,如果我尝试以编程方式实例化同一个bean,将ImportResource
转换为Import
,我会得到“找不到依赖的类型[org.hibernate.SessionFactory]的匹配bean ...”错误。
@Configuration
@Import(BeanConfig.class)
public class AppConfig extends WebMvcConfigurerAdapter
{
Bean配置类:
@Configuration
public class BeanConfig
{
@Autowired
private SessionFactory sessionFactory;
@Bean(name="myBeanId")
public MyBeanClass createMyBeanClass()
{
MyBeanClass mbc = new MyBeanClass();
mbc.setSessionFactory(sessionFactory);
....
return mbc;
编辑:如果我向@Autowired添加了一个required = false,那么肯定会创建sessionFactory bean,然后在加载完所有内容后手动注入sessionFactory。它工作正常。
编辑2: 我没有web.xml,我使用的是servlet 3,因此以编程方式声明了所有内容。这是我的web.xml等价物
@Configuration
public class WalletInitialiser implements WebApplicationInitializer
{
@Override
public void onStartup(ServletContext aServletContext) throws ServletException
{
AnnotationConfigWebApplicationContext mvcContext
= new AnnotationConfigWebApplicationContext();
mvcContext.register(AppConfig.class);
mvcContext.scan("config.packages", "class.packages");
aServletContext.addListener(new ContextLoaderListener(mvcContext));
//add security filters, dispatcher to servlet, logback
我的SessionFactory配置在另一个类中,配置包中的HibernateConfig,正在从
中获取mvcContext.scan("config.packages", "class.packages");
此课程摘录如下:
@Configuration
@EnableTransactionManagement
public class HibernateConfig
{
@Bean(name="my_session_factory")
public LocalSessionFactoryBean baseSessionFactory()
{
LocalSessionFactoryBean lsfb= new LocalSessionFactoryBean();
lsfb.setPackagesToScan("class.packages");
lsfb.setAnnotatedPackages("class.packages");
//add hibernate props for datasource
return lsfb;
}
}
答案 0 :(得分:1)
此问题可能与How to make factoryBeans work...有关。虽然它不是完全匹配Configuring Hibernate Session Factory可能会给出解决方案的见解。
我建议尝试这个:
@Configuration
public class BeanConfig {
@Autowired
private LocalSessionFactoryBean sessionFactoryBean;
@Bean(name="myBeanId")
public MyBeanClass createMyBeanClass() {
MyBeanClass mbc = new MyBeanClass();
mbc.setSessionFactory((SessionFactory) sessionFactoryBean.getObject());
....
return mbc;
}
}
可能有其他方法可以解决这个问题,我没有跟踪春季源论坛中提到的JIRA问题,他们可能指向“标准”方式。或者,Spring文档可以提供对java config中FactoryBeans处理的一些了解。