SSM框架新特性关于用Java配置类完全代替XML

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器 

  • 替代web.xml

实现WebApplicationInitializer

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import java.util.EnumSet;

public class WebInitializer implements WebApplicationInitializer {
    public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(AppConfig.class);
        ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");

        //配置encodingFilter
        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding", new CharacterEncodingFilter());
        encodingFilter.setInitParameter("encoding","UTF-8");
        encodingFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/*");


    }

}

以上代码以上的代码分别调用了servletContext.addServlet,servletContext.addFilter来注册servlet和filter。也实现了根据配置文件注册Spring容器和SpringMVC容器。

 

  • spring-common和spring-mvc.xml

spring-mvc.xml

@Configuration  
@ComponentScan(basePackages="septem.controller")  
@EnableWebMvc  
public class WebConfig {  
}  

这是对应spring-mvc.xml的部分
           @Configuration及其下的@bean(比如注册了JSP的视图解析器的bean等springmvc常配置的bean)       Configuration注解就是告诉Spring这个是一个配置文件类,这里配置的Bean要交给Spring去管理
          @ComponentScan("com.neusoft.hr.app") //相当于<context:component-scan base-package="com.neusoft.hr.app"          配合@Controller注册Controller的bean
          @EnableWebMvc //相当于 <mvc:annotation-driven/>   启用Spring MVC支持
          至此spring-mvc.xml完全被代替。


spring-common.xml

一些bean(dao,service)的注册

@Configuration  
@ComponentScan(basePackages="septem.service")  
public class AppConfig {  
}  

这部分相当于spring-common.xml中管理的常用dao(mapper)、Service
           @Configuration标记这是一个配置类
           @ComponentScan配合@Repository、 @Service注册dao和Service的bean     
           @MapperScan("com.neusoft.hr.app.dao")
//Mybatis mapper.class的位置相当MapperScannerConfigurer 的bean        如果用的是mybatis的话,用@MapperScan注册mapper的bean          

声明性事务

@Configuration  
@EnableTransactionManagement  
public class DataConfig {  
      
    @Bean public AnnotationSessionFactoryBean sessionFactory() {    
        AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();    
        sessionFactoryBean.setDataSource(dataSource());    
        sessionFactoryBean.setNamingStrategy(new ImprovedNamingStrategy());  
        sessionFactoryBean.setPackagesToScan("septem.model");  
        sessionFactoryBean.setHibernateProperties(hProps());  
        return sessionFactoryBean;    
    }   
      
    private DataSource dataSource() {  
        BasicDataSource source = new BasicDataSource();  
        source.setDriverClassName("org.hsqldb.jdbcDriver");  
        source.setUrl("jdbc:hsqldb:mem:s3demo_db");  
        source.setUsername("sa");  
        source.setPassword("");  
        return source;  
    }  
      
    @Bean public HibernateTransactionManager transactionManager() {    
        HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();    
        hibernateTransactionManager.setSessionFactory(sessionFactory().getObject());    
        return hibernateTransactionManager;    
    }    
  
    private Properties hProps() {  
        Properties p = new Properties();  
        p.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");  
        p.put("hibernate.cache.use_second_level_cache", "true");  
        p.put("hibernate.cache.use_query_cache", "true");  
        p.put("hibernate.cache.provider_class",  
                "org.hibernate.cache.EhCacheProvider");  
        p.put("hibernate.cache.provider_configuration_file_resource_path",  
                "ehcache.xml");  
        p.put("hibernate.show_sql", "true");  
        p.put("hibernate.hbm2ddl.auto", "update");  
        p.put("hibernate.generate_statistics", "true");  
        p.put("hibernate.cache.use_structured_entries", "true");  
        return p;  
    }  
  
}  

这里对应spring.xml的数据库和事务部分
           @Configuration及其下的@bean(比如注册了DataSource和sqlSessionFactory等的bean)       Configuration注解就是告诉Spring这个是一个配置文件类,这里配置的Bean要交给Spring去管理
           @EnableTransactionManagement 相当于<tx:annotation-driven />

 至此,spring-common.xml完全被代替


以上这里是将AppConfig分成了几部分。
           其实可以只用一个AppConfig代替spring-common.xml和spring-mvc.xml
   @Configuration告诉Spring这是一个配置类,其下的@Bean注册了Spring的dataSource、sqlSessionFactory\DataSourceTransactionManager等bean,还有SpringMVC的jsp视图解析器等bean
        @ComponentScan配合@Repository、@Service、@Controller注册dao、Service、Controller的bean;注意如果用的是mybatis的话,还需另外加上@MapperScan注册mapper的bean
          @EnableTransactionManagement  开启声明式事务
          @EnableWebMvc开启springmvc的注解
          至此配置类完全代替spring-common.xml和spring-mvc.xml

package com.neusoft.hr.sys.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.neusoft.hr.sys.Convertor.DateConverter;
import com.neusoft.hr.sys.interceptor.AuthInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
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.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import javax.sql.DataSource;
import java.text.SimpleDateFormat;
import java.util.List;

@Configuration                                  //定义配置类,可代替XML文件
@EnableWebMvc //相当于 <mvc:annotation-driven/>
@PropertySource("classpath:app.properties") //相当于<context:property-placeholder location="classpath:app.properties"/>
@ComponentScan("com.neusoft.hr.app") //相当于<context:component-scan base-package="com.neusoft.hr.app"
@EnableTransactionManagement // <tx:annotation-driven />
@MapperScan("com.neusoft.hr.app.dao")//Mybatis mapper.class的位置          相当于MapperScannerConfigurer的bean
public class AppConfig extends WebMvcConfigurerAdapter {


    @Autowired
    private Environment environment;

    /**
     * 配置试图解析器,这里的视图解析器是相当于servlet内部解析器,调用了forward方法
     *
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/view/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }

    /**
     * 配置公用字符串转日期
     * @param registry
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {

        registry.addConverter(new DateConverter());
    }


    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                .indentOutput(true)
                .dateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }

    /**
     * 配置静态资源映射
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/").setCachePeriod(31536000);
        super.addResourceHandlers(registry);
    }

    /**
     * 其他找不到的资源就交给默认的servlet处理
     *
     * @param configurer
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
        super.configureDefaultServletHandling(configurer);
    }

    /*
    * 注册拦截器
    * */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())                                                              //这个拦截类是com.neusoft.hr.sys.interceptor.AuthInterceptor
                .addPathPatterns("/**").excludePathPatterns("/static/**", "/login.*", "/login/**");
    }

    /**
     * 配置数据库连接池
     * @return
     */
    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(environment.getProperty("jdbc.url"));
        druidDataSource.setUsername(environment.getProperty("jdbc.username"));
        druidDataSource.setPassword(environment.getProperty("jdbc.password"));
        return druidDataSource;
    }

    /**
     * 配置sqlSessionFactory
     *
     * @return
     * @throws Exception
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        //设置数据库连接池
        factoryBean.setDataSource(dataSource());
        //设置mapper.xml文件的位置,如果不设置的话,你需要把mapper.xml放置在于mapper.class相同的位置
        //factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));

        factoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:/mybatis-config.xml"));
        return factoryBean.getObject();
    }

    /**
     * 配置事物管理器
     *
     * @return
     */
    @Bean
    public DataSourceTransactionManager transactionManager() {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource());
        return dataSourceTransactionManager;
    }




}

本文参考spring3.0使用annotation完全代替XML(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值