丢掉xml使用JavaConfig配置Spring
Spring JavaConfig
最近擼了一遍Spring action 4,發現里面講的都不再使用xml文件來配置spring,全都采用Java代碼來配置.
用Java代碼配置的話,感覺要比xml更便于維護,而且用代碼肯定比xml更爽嘛
下面來一步步用JavaConfig搭一個Spring工程
那在用xml配置的時候,項目都是從加載web.xml文件再掃描到各種spring-*.xml文件
那不用xml文件,項目從哪里啟動呢?
那就要靠這個類了,AbstractAnnotationConfigDispatcherServletInitializer,這個就相當于web.xml啦,在這里面可以配置上下文,DispatcherServlet,過濾器等等bean;
首先咱先創建一個類SpittrWebAppInitialzer
package com.fireyao;import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;public class SpittrWebAppInitialzer extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 配置root上下文,如Jpa數據源等等的配置* @return*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{RootConfig.class};}/*** 配置dispatcher servlet* @return*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{WebConfig.class};}/*** 將DispatcherServlet映射到 "/"* 指定開始被servlet處理的url,配置從/開始 * @return*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}/*** 這里注冊的所有過濾器,都會映射到DispatcherServlet* 就是說這里的過濾器過濾規則是 /** 所有的請求都會先到這里注冊的過濾器中** @return*/@Overrideprotected Filter[] getServletFilters() {return new Filter[]{new CharacterEncodingFilter("UTF-8", true)};} }復制代碼在SpittrWebAppInitialzer類里面加載了RootConfig和WebConfig兩個配置類,
再創建這兩個類以及相關的配置(以下省略package和import)
RootConfig
/*** 相當于applicationContext.xml*/ @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = {"com.fireyao.repository"},entityManagerFactoryRef = "entityManagerFactory",transactionManagerRef = "transactionManager") @PropertySource(value = {"classpath:db.properties", "classpath:hibernate.properties", "classpath:app.properties"}) @ComponentScan(basePackages = "com.fireyao",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)}) @EnableAspectJAutoProxy(proxyTargetClass = true) /*** proxyTargetClass = true ==> 使用cglib代理* proxyTargetClass = false(默認) ==> 使用JDK代理*/ public class RootConfig {@Value(value = "${db.driver:org.postgresql.Driver}")private String DRIVERCLASSNAME;@Value("${db.username}")private String USERNAME;@Value("${db.password}")private String PASSWORD;@Value("${db.jdbcURL}")private String URL;@Value("${hibernate.hbm2dll.create_namespaces}")private String CREATE_NAMESPACES;@Value("${hibernate.hbm2ddl.auto}")private String HBM2DDL_AUTO;@Value("${hibernate.show_sql}")private String SHOW_SQL;@Value("${hibernate.format_sql}")private String FORMAT_SQL;@Value("${hibernate.generate_statistics}")private String GENERATE_STATISTICS;/*** 配置數據源*/@Bean(name = "dataSource")public DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(DRIVERCLASSNAME);dataSource.setUrl(URL);dataSource.setUsername(USERNAME);dataSource.setPassword(PASSWORD);/* 配置初始化大小、最小、最大*/dataSource.setInitialSize(5);dataSource.setMinIdle(5);dataSource.setMaxActive(20);/* 配置獲取連接等待超時的時間*/dataSource.setMaxWait(30000);/*配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒*/dataSource.setTimeBetweenEvictionRunsMillis(60000);/*配置一個連接在池中最小生存的時間,單位是毫秒*/dataSource.setMinEvictableIdleTimeMillis(300000);/*申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效*/dataSource.setTestWhileIdle(true);dataSource.setValidationQuery("select 1");return dataSource;}@Beanpublic HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {return new HibernateJpaVendorAdapter();}@Bean(name = "entityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactory(DruidDataSource dataSource,HibernateJpaVendorAdapter hibernateJpaVendorAdapter) {LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();entityManagerFactory.setDataSource(dataSource);entityManagerFactory.setJpaVendorAdapter(hibernateJpaVendorAdapter);entityManagerFactory.setPackagesToScan("com.fireyao.domain");/*指定JPA屬性;如Hibernate中指定是否顯示SQL的是否顯示、方言等*/Map<String, Object> jpaProp = new HashMap();jpaProp.put("hibernate.dialect", new PostgisDialect());jpaProp.put("hibernate.hbm2ddl.auto", HBM2DDL_AUTO);jpaProp.put("hibernate.show_sql", SHOW_SQL);jpaProp.put("hibernate.generate_statistics", GENERATE_STATISTICS);jpaProp.put("hibernate.format_sql", FORMAT_SQL);jpaProp.put("hibernate.hbm2dll.create_namespaces", CREATE_NAMESPACES);entityManagerFactory.setJpaPropertyMap(jpaProp);return entityManagerFactory;}/*** 事務管理器** @param entityManagerFactory* @return*/@Bean(name = "transactionManager")public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactory) {return new JpaTransactionManager(entityManagerFactory.getObject());} }復制代碼WebConfig
/*** 相當于springmvc-servlet.xml*/ @Configuration @EnableWebMvc//啟用spring mvc @ComponentScan(basePackages = "com.fireyao.controller") //啟用組件掃描 public class WebConfig extends WebMvcConfigurerAdapter {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);//處理中文亂碼問題List<MediaType> fastMediaTypes = new ArrayList<>();fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);fastConverter.setSupportedMediaTypes(fastMediaTypes);fastConverter.setFastJsonConfig(fastJsonConfig);converters.add(fastConverter);}/*** Thymeleaf視圖解析器** @param springTemplateEngine* @return*/@Beanpublic ThymeleafViewResolver viewResolver(SpringTemplateEngine springTemplateEngine) {ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setTemplateEngine(springTemplateEngine);viewResolver.setCharacterEncoding("utf-8");return viewResolver;}/*** 模版引擎** @param iTemplateResolver* @return*/@Beanpublic SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(iTemplateResolver);return templateEngine;}/*** Thymeleaf3.0之后* Thymeleaf模版解析器** @return*/@Beanpublic ITemplateResolver iTemplateResolver() {SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();templateResolver.setTemplateMode("HTML5");templateResolver.setPrefix("/WEB-INF/templates/");templateResolver.setSuffix(".html");templateResolver.setTemplateMode("HTML");templateResolver.setCharacterEncoding("utf-8");templateResolver.setCacheable(false);return templateResolver;}/*** Thymeleaf3.0之前* Thymeleaf模版解析器* @return*//* @Beanpublic TemplateResolver templateResolver() {TemplateResolver resolver = new ServletContextTemplateResolver();resolver.setPrefix("/WEB-INF/VIEWS/");resolver.setSuffix(".html");resolver.setTemplateMode("HTML5");resolver.setCacheable(false);return resolver;}*//*** 配置靜態資源的處理* 要求DispatcherServlet將對靜態資源的請求轉發到Servlet容器中默認的Servlet上* 而不是使用DispatcherServlet本身來處理此類請求。** @param configurer*/@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}/*** 配置視圖解析器* ==> JSP視圖** @return*//*@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");resolver.setExposeContextBeansAsAttributes(true);return resolver;}*/ }復制代碼@Configuration 標注為配置類
@EnableTransactionManagement注解開啟注解式事務的支持。
@EnableJpaRepositories注解開啟對Spring Data JPA Repostory的支持
@PropertySource 掃面db.properties等配置文件,可以用@Value注解取到properties中的值
@ComponentScan 配置掃描類包 相當于<context:component-scan base-package="com.fireyao"/>
@EnableAspectJAutoProxy 表示開啟AOP代理自動配置
@EnableAspectJAutoProxy中proxyTargetClass屬性
? proxyTargetClass = true ==> 使用cglib代理
? proxyTargetClass = false(默認) ==> 使用JDK代理
那spring最基本的JavaConfig就這樣了.
是不是看上去很舒服,果然還是要用Java代碼才爽.
原文鏈接:丟掉xml使用JavaConfig配置Spring | 火堯
作者:火堯
鏈接:https://juejin.im/post/59ddc6626fb9a0452404cd06
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的丢掉xml使用JavaConfig配置Spring的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop2.2支持snappy压缩安
- 下一篇: Rdd没法调用toDF原因