プログラムでアプリケーション構成をセットアップし、次のような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;
編集:required = falseを@Autowiredに追加し、すべてがロードされたら手動でsessionFactoryを注入すると、sessionFactoryBeanは確実に作成されます。正常に動作します。
編集2:web.xmlがありません。サーブレット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;
}
}