Spring boot 2. Метод @Bean, вызываемый перед внедрением зависимости @Autowired - PullRequest
0 голосов
/ 24 ноября 2018

Это просто любопытство.В приведенном ниже примере @Autowired EntityManagerFactory и @Autowired ApplicationContext внедряются перед методом @Bean entityManager ().

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    private ApplicationContext context;


    @Bean
    public EntityManager entityManager() {

        EntityManager entityManager = entityManagerFactory.createEntityManager();
        return entityManager;
    }

}

Но когда я изменяю тип бина EntityManager на SessionFactory, тогда метод sessionFactory () вызывается перед автоматической связкой ApplicationityManagerFbean-компоненты, вызывающие исключение NullPointerException при развертывании SessionFactory.Фрагмент кода ниже

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    private ApplicationContext context;


    @Bean
    public SessionFactory sessionFactory() {

        EntityManager entityManager = entityManagerFactory.createEntityManager();
        return entityManager.unwrap(SessionFactory.class);
    }

}

И мой вопрос: почему это происходит?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Начиная с Hibernate 5.2, SessionFactory также является EntityManagerFactory, поскольку теперь он расширяет указанный интерфейс.До этого SessionFactory заключал в оболочку EntityManagerFactory.

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

0 голосов
/ 24 ноября 2018

Насколько я помню, есть два способа получить SessionFactory:
Из EntityManagerFactory

return entityManagerFactory.unwrap(SessionFactory.class)
//or -> if you have entitymanager
return em.getEntityManagerFactory().unwrap(SessionFactory.class);

Из сеанса

Session session = entityManager.unwrap(Session.class);
return session.getSessionFactory();


И причины, по которым вы любопытны, например, как вы сказали

Метод sessionFactory () вызывается перед автосинхронизацией компонентов EntityManagerFactory и ApplicationContext, вызывающих NullPointerException

Дело не в этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...