Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Diferentes classes de configuração são mesmo necessárias?

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?

1 resposta
solução!

Oi amigo,

Como você mencionou, não é obrigatório realizar essa divisão entre AppWebConfiguration e JPAConfiguration, é mais uma questão didática.