Доброго дня всем! Перешел с xml конфигурации на java config, все отлично работает, только непонимание одной вещи мучает: Когда я создаю :
public PlatformTransactionManager transactionManager(EntityManagerFactory emf)
то в аргументах метода существует ссылка на EntityManagerFactory emf. В xml-е когда я делал transactionManager, то он ссылался на фабрику, тут как я понимаю тоже самое происходит , но видимо у меня небольшой пробел в знаниях, ведь я похожие вещи делал, но так же не понимал, в какой момент создается объект, подхватывается, т.е чувствую, но не вижу очевидной связи. Может, если в данном примере все бины синглтоны, при поднятии контекста, он их сопоставляет?
Ниже полный код:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import javax.persistence.EntityManagerFactory;
import java.util.Properties;
@Configuration
@ComponentScan("com.springapp.mvc")
@EnableWebMvc
@EnableTransactionManagement
public class MvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("/");
}
@Bean(name = "dataSource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/mydbtest?useSSL=false");
driverManagerDataSource.setUsername("root");
driverManagerDataSource.setPassword("root");
return driverManagerDataSource;
}
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean EMFactory = new LocalContainerEntityManagerFactoryBean();
EMFactory.setDataSource(dataSource());
EMFactory.setPackagesToScan("com.springapp.mvc.Entities");
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
EMFactory.setJpaVendorAdapter(vendorAdapter);
EMFactory.setJpaProperties(additionalProperties());
return EMFactory;
}
Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "update");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
}