public class ZeusWebApplicationInitializer implements WebApplicationInitializer { public void onStartup(ServletContext container) { WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(container); if (rootContext == null) { rootContext = new AnnotationConfigWebApplicationContext(); //((AnnotationConfigWebApplicationContext) rootContext).register(DefaultAppConfig.class); } if (container.getInitParameter("contextConfigLocation") == null) { container.setInitParameter("contextConfigLocation", "classpath:config/applicationContext.xml"); } ContextLoaderListener contextLoaderListener = new ContextLoaderListener(rootContext); container.addListener(contextLoaderListener); //开启页面会话 if (container.getFilterRegistration("SpringOpenEntityManagerInViewFilter") == null) { Filter springOpenEntityManagerInViewFilter = new OpenEntityManagerInViewFilter(); FilterRegistration springOpenEntityManagerInViewFilterRegistration = container.addFilter("SpringOpenEntityManagerInViewFilter", springOpenEntityManagerInViewFilter); springOpenEntityManagerInViewFilterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC), false, "*.do"); } //web调度器 if (container.getServletRegistration("dispatcher") == null) { DispatcherServlet dispatcherServlet = new DispatcherServlet(); ServletRegistration.Dynamic registration = container.addServlet("dispatcher", dispatcherServlet); registration.setLoadOnStartup(1); registration.setInitParameter("contextConfigLocation", "classpath:config/dispatcher-servlet.xml"); registration.addMapping("*.do"); } //字符编码 if (container.getFilterRegistration("characterEncodingFilter") == null) { CharacterEncodingFilter def = new CharacterEncodingFilter(); def.setEncoding("UTF-8"); FilterRegistration.Dynamic defFilter = container.addFilter("characterEncodingFilter", def); defFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC), false, "*.do"); } } }
@Configuration @ComponentScan(basePackages = {"com.zk.zeus"}) @EnableTransactionManagement @PropertySource(value = {"classpath:config/hibernate.properties"}) public class BeansConfig extends WebMvcConfigurerAdapter { @Autowired private Environment environment; private Properties hibernateProperties() { Properties properties = new Properties(); properties.put("hibernate.jdbc.batch_size", environment.getRequiredProperty("hibernate.jdbc.batch_size")); properties.put("hibernate.jdbc.fetch_size", environment.getRequiredProperty("hibernate.jdbc.fetch_size")); properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto")); properties.put("hibernate.cache.use_second_level_cache", environment.getRequiredProperty("hibernate.cache.use_second_level_cache")); //3.6及以下用provider_class //properties.put("hibernate.cache.provider_class", environment.getRequiredProperty("hibernate.cache.provider_class")); //4.x用factory_class properties.put("hibernate.cache.region.factory_class", environment.getRequiredProperty("hibernate.cache.region.factory_class")); properties.put("hibernate.cache.use_structured_entries", environment.getRequiredProperty("hibernate.cache.use_structured_entries")); properties.put("hibernate.cache.provider_configuration_file_resource_path", environment.getRequiredProperty("hibernate.cache.provider_configuration_file_resource_path")); return properties; } @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); sessionFactory.setPackagesToScan(new String[] {"com.zk.zeus.**"}); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(environment.getRequiredProperty("hibernate.connection.driver_class")); dataSource.setUrl(environment.getRequiredProperty("hibernate.connection.url")); dataSource.setUsername(environment.getRequiredProperty("hibernate.connection.username")); dataSource.setPassword(environment.getRequiredProperty("hibernate.connection.password")); return dataSource; } @Bean @Autowired public HibernateTransactionManager transactionManager(SessionFactory s) { HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(s); return txManager; } }
测试时需要模拟一个web context
//mock a ServletContext @WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {BeansConfig1.class}) public class AppConfigTest { @Autowired WebApplicationContext wac; // cached @Autowired MockServletContext servletContext; // cached @Autowired MockHttpSession session; @Autowired MockHttpServletRequest request; @Autowired MockHttpServletResponse response; @Autowired ServletWebRequest webRequest; @Resource(name = "employeeService") EmployeeService service; @Test public void testSaveEmployee() { //AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); //EmployeeService service = (EmployeeService) context.getBean("employeeService"); /* * Create Employee1 */ Employee employee1 = new Employee(); employee1.setName("Han Yenn"); //employee1.setDate(new Date(2010, 10, 10)); employee1.setSalary(new BigDecimal(10000)); employee1.setSsn("ssn00000001"); /* * Create Employee2 */ Employee employee2 = new Employee(); employee2.setName("Dan Thomas"); //employee2.setJoiningDate(new LocalDate(2012, 11, 11)); employee2.setSalary(new BigDecimal(20000)); employee2.setSsn("ssn00000002"); /* * Persist both Employees */ service.saveEmployee(employee1); service.saveEmployee(employee2); /* * Get all employees list from database */ List<Employee> employees = service.findAllEmployees(); for (Employee emp : employees) { System.out.println(emp); } /* * delete an employee */ service.deleteEmployeeBySsn("ssn00000002"); /* * update an employee */ Employee employee = service.findBySsn("ssn00000001"); employee.setSalary(new BigDecimal(50000)); service.updateEmployee(employee); /* * Get all employees list from database */ List<Employee> employeeList = service.findAllEmployees(); for (Employee emp : employeeList) { System.out.println(emp); } // context.close(); } }
@Configuration @ComponentScan(basePackages={"com.websystique.spring"}) @EnableTransactionManagement @Import({BeansConfig.class,WebConfig.class}) public class BeansConfig1 extends WebMvcConfigurerAdapter { }
import javax.persistence.EntityManagerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager; import org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource; @Configuration @ComponentScan(basePackages = {"com.zk.zeus"}) @EnableTransactionManagement public class ZeusProfileBeansConfig { @Autowired private Environment environment; @Bean public PersistenceAnnotationBeanPostProcessor pab() { return new PersistenceAnnotationBeanPostProcessor(); } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean(); emfb.setPersistenceUnitName("zeus-profile-cassandra"); emfb.setPersistenceUnitManager(persistenceUnitManager()); emfb.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver()); emfb.setPackagesToScan("com.zk.zeus"); return emfb; } @Bean public DefaultPersistenceUnitManager persistenceUnitManager() { DefaultPersistenceUnitManager pum = new DefaultPersistenceUnitManager(); pum.setPersistenceXmlLocations("META-INF/persistence.xml"); /* * Map<String, String> propertyMap = new HashMap<String, String>(); * propertyMap.put(CassandraConstants.CQL_VERSION, CassandraConstants.CQL_VERSION_3_0); * EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT, propertyMap); * EntityManager entityManager = emf.createEntityManager(); */ return pum; } public MatchAlwaysTransactionAttributeSource matchAllWithPropReq() { MatchAlwaysTransactionAttributeSource matchResource = new MatchAlwaysTransactionAttributeSource(); //matchResource.setTransactionAttribute(TransactionAttribute.PROPAGATION_REQUIRED); return matchResource; } @Bean @Autowired public JpaTransactionManager txManager(EntityManagerFactory emf) { JpaTransactionManager txManager = new JpaTransactionManager(); txManager.setEntityManagerFactory(emf); return txManager; } // public JndiTemplate jndiTemplate() // { // JndiTemplate JndiTemplate = new JndiTemplate(); // Properties properties = new Properties(); // properties.setProperty("java.naming.factory.initial", "org.apache.naming.java.javaURLContextFactory"); // properties.setProperty("java.naming.factory.url.pkgs", "org.apache.naming"); // return JndiTemplate; // } }