LINUX.ORG.RU

Вопрос про @Configuration в Spring

 ,


0

1

Как правильно обращаться к создаваемым бинам внутри класса конфигурации если один бин зависит от другого? Вот такой пример приводит к ошибке «Error creating bean with name 'sessionFactoryBean': Requested bean is currently in creation: Is there an unresolvable circular reference?»

@Configuration
@PropertySource("classpath:properties/hibernate.properties")
public abstract class HibernateConfig {
	@Autowired
	Environment env;
	@Autowired
	DataSource dataSource;

	@Bean(name = "sessionFactoryBean")
	public LocalSessionFactoryBean getSessionFactory()
	{
		LocalSessionFactoryBean fb = new LocalSessionFactoryBean();
		fb.setDataSource(dataSource);
		fb.setHibernateProperties(new Properties() {
			private static final long serialVersionUID = 1L;
		{
			setProperty("hibernate.show_sql", 
					env.getProperty("hibernate.show_sql"));
			setProperty("hibernate.format_sql", 
					env.getProperty("hibernate.format_sql"));
			setProperty("hibernate.use_sql_comments",
					env.getProperty("hibernate.use_sql_comments"));
			setProperty("hibernate.hbm2ddl.auto",
					env.getProperty("hibernate.hbm2ddl.auto"));
			setProperty("hibernate.dialect",
					env.getProperty("hibernate.dialect"));
		}});

		return fb;
	}

	@Autowired
	LocalSessionFactoryBean sessionFactoryBean;
	@Bean(name = "transactionManager")
	public HibernateTransactionManager getTransactionManager()
	{
		HibernateTransactionManager htm = new HibernateTransactionManager();
		htm.setSessionFactory(sessionFactoryBean.getObject());
		return htm;
	}
}



Последнее исправление: xio4 (всего исправлений: 1)

Ответ на: комментарий от xio4
<web-app>
  <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
       instead of the default XmlWebApplicationContext -->
  <context-param>
      <param-name>contextClass</param-name>
      <param-value>
          org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
  </context-param>

  <!-- Configuration locations must consist of one or more comma- or space-delimited
       fully-qualified @Configuration classes. Fully-qualified packages may also be
       specified for component-scanning -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.acme.AppConfig</param-value>
  </context-param>

  <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- Declare a Spring MVC DispatcherServlet as usual -->
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
           instead of the default XmlWebApplicationContext -->
      <init-param>
          <param-name>contextClass</param-name>
          <param-value>
              org.springframework.web.context.support.AnnotationConfigWebApplicationContext
          </param-value>
      </init-param>
      <!-- Again, config locations must consist of one or more comma- or space-delimited
           and fully-qualified @Configuration classes -->
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>com.acme.web.MvcConfig</param-value>
      </init-param>
  </servlet>

  <!-- map all requests for /main/* to the dispatcher servlet -->
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/main/*</url-pattern>
  </servlet-mapping>
</web-app>

пацаны, если биореактор еще будет про собес вещать, кидайтесь в него камнями!

anonymous
()
Ответ на: комментарий от xio4

кого вообще волнует, что там написано, при чем здесь ты вообще? я поражаюсь общей изящности.

anonymous
()
Ответ на: комментарий от php-coder

Все верно, но было подозрение, что будет создано 2 экземпляра LocalSessionFactoryBean, пока в доках не нашел инфу про инжекцию конструктора:

3.11.4.2 Injecting dependencies

When @Beans have dependencies on one another, expressing that dependency is as simple as having one bean method call another:

@Configuration
public class AppConfig {

  @Bean
  public Foo foo() {
      return new Foo(bar());
  }

  @Bean
  public Bar bar() {
      return new Bar();
  }

}                

In the example above, the foo bean receives a reference to bar via constructor injection.

xio4
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.