Pessoal bom dia, tudo bem?
Estou refazendo o curso de Spring MVC I, e fiquei com uma dúvida com relação à quantidade de classes de configuração que são criadas durante o curso.
Bom, na aula atual, estamos fazendo a configuração do Hibernate/JPA com o Spring MVC e o instrutor criou uma classe chamada JPAConfiguration. Essa classe foi mapeada dentro da classe de configuração do projeto (vulgo AppWebConfiguration) dentro do método getServletConfigClasses
, assim:
public class SpringMVCServletDispatcher extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {AppWebConfiguration.class, JPAConfiguration.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
O que eu fiquei na dúvida é... realmente é necessário realizar essa divisão entre AppWebConfiguration.class e JPAConfiguration.class? Levando em consideração que ambas as classes fazem parte do padrão Factory e usam CDI para injeção de dependências, não vejo necessidade de dividir a criação dos beans em duas classes. Eu implementei diferente do curso e também funciona:
public class LojaServletDispatcher extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {LojaConfiguration.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
Dentro de LojaConfiguration.class, existem todos os factory methods que o Spring precisa, como é possível ver abaixo:
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {
HomeController.class,
ProdutoDAO.class
})
public class LojaConfiguration {
@Bean
public InternalResourceViewResolver internalResourceViewResolverFactory() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Bean
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactory() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl("jdbc:mysql://192.168.99.100:3306/casadocodigo");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("");
dataSource.setPassword("");
JpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.hbm2ddl.auto", "update");
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
factoryBean.setPackagesToScan(Produto.class.getPackage().getName());
factoryBean.setJpaProperties(properties);
return factoryBean;
}
@Bean
public PlatformTransactionManager transactionManagerFactory(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Existe algum motivo realmente relevante para realizar essa divisão, ou é apenas uma questão didática?