SSM框架全注解整合的注意点

SSM框架全注解整合的注意点
既然是全注解整合,XML最后一定是被消灭的,罗列一下要创建的Config类和对应的被消灭的XML;

applicationContext-dao.xml+applicationContext-service.xml对应MybatisConfig+SpringConfig;
springmvc.xml对应SpringMVCConfig;
这里要解释一下,xml里面为什么没有mybatis的,是因为被Spring整合进了applicationContext;


  • SpringConfig里面首先需要加入Spring的注解@Configration,该类等价 与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样,并且此注解确保了Spring的单例设计原则,节省内存,能创建一个对象解决问题,就别创建多个;

  • 其次需要制定扫包的路径,使用注解@ComponentScan;
    开启Spring天生支持的AOP及事务;

/**
 * 定义服务层的配置类
 */
@Configuration
/**
 * @ComponentScan:
 *  如果不指定扫包的路径,默认加载当前路径同级或者一切子目录下
 */
@ComponentScan(basePackages = "com.itheima",
        excludeFilters = @ComponentScan.Filter(
                //type指定根据ANNOTATION注解类型过滤
                type = FilterType.ANNOTATION,
                //指定要被过滤的bean注解
                value = {
                        Controller.class,
                        RestController.class,
                        ControllerAdvice.class,
                        RestControllerAdvice.class
                }))
@EnableAspectJAutoProxy//开启aop支持
@EnableTransactionManagement//开启事务支持
@Import(MybatisConfig.class)//等价于<import resource="classpath:applicationContext-dao.xml.bak"/>
public class SpringConfig {
}

  • MybatisConfig里首先同样要添加注解@Configration;
  • 然后添加注解@PropertySource来指定连接数据库的jdbc.properties和编码格式;
  • @MapperScan扫描Mapper接口;
  • 类中定义@Bean方法导入,dataSource、sqlSessionFactoryBean、transactionManager;
/**
 * 定义mybatis的配置陪
 */
@Configuration
@PropertySource(value = "classpath:jdbc.properties",encoding = "UTF-8")
@MapperScan("com.itheima.dao")//定义扫描mapper接口
public class MybatisConfig {

    @Value("${jdbc.userName}")
    private String userName;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.driverClass}")
    private String driverClass;

    /**
     * 定义数据源:连接池对象
     * @return
     */
    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClass);
        return dataSource;
    }

    /**
     * 定义回话工厂bean
     * 说明:因为容器中只定义了一个DataSource,所以方法入参可以不通过@Qualifier("dataSource")指定
     * 具体的bean对象;
     * @param dataSource
     * @return
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource){
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.itheima.pojo");
        //定义settings的属性properties对象
        Properties properties = new Properties();
        properties.setProperty("mapUnderscoreToCamelCase","true");
        properties.setProperty("cacheEnabled","false");
        factoryBean.setConfigurationProperties(properties);
        //配置分页插件
        factoryBean.setPlugins(new Interceptor[]{pageInterceptor()});
        return factoryBean;
    }

    @Bean
    public PageInterceptor pageInterceptor(){
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect","mysql");
        properties.setProperty("reasonable","true");
        pageInterceptor.setProperties(properties);
        return pageInterceptor;
    }

    /**
     * mapperScannerConfigurer作用:注册dao信息,不做实例化处理
     * 也就是说这个类的动作是在spring的注册bean的阶段,不是实例化的阶段
     * @return
     */
//    @Bean
//    public MapperScannerConfigurer mapperScannerConfigurer(){
//        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//        mapperScannerConfigurer.setBasePackage("com.itheima.dao");
//        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
//        return mapperScannerConfigurer;
//    }

    /**
     * 定义事务管理器
     * @param dataSource
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }

  • SpringMVCConfig的配置一样需要@Configration;
  • 扫包@ComponentScan;
  • 开启SpringMVC扩展功能@EnableWebMvc;
  • 配置视图解析器InternalResourceViewResolver;
  • 在类中配置释放静态的@Bean,需要参数DefaultServletHandlerConfigurer的实例,通过实例的enable()方法释放;
@Configuration
@ComponentScan(basePackages = "com.itheima.web")
@EnableWebMvc//等价于<mvc:annotation-driven/>,开启springmvc的扩展功能
public class SpringMvcConfig implements WebMvcConfigurer {


    @Bean
    public InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    /**
     * 配置静态资源释放
     * @param configurer
     */

    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        //等价于 <mvc:default-servlet-handler/>
        configurer.enable();
    }

  • 最后配置web工程初始化类ProjectInitConfig,这个类是web相关,所以不用注解@Configration;
  • 需要实现一个DispatcherServlet初始化的类AbstractAnnotationConfigDispatcherServletInitializer;
  • 注册过滤器,传入参数ServletContext的实例,通过addFilter返回一个动态过滤器,通过Dynamic设置 要过滤的参数和规则;
  • 导入父子容器,SpringConfig.class,SpringMvcConfig.class;
  • 重写getServletMappings(),来定义核心控制器的拦截规则;
/**
 * 工程初始化配置类
 */
public class ProjectInitConfig  extends AbstractAnnotationConfigDispatcherServletInitializer {
    //定义获取父容器资源的配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }


    /**
     * 注册过滤器
     * @param servletContext
     * @throws ServletException
     */
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        FilterRegistration.Dynamic dynamic = servletContext.addFilter("characterEncodingFilter", CharacterEncodingFilter.class);
        //设置过滤器初始化的参数
        dynamic.setInitParameter("encoding","utf-8");
        dynamic.setInitParameter("forceRequestEncoding","true");
        dynamic.setInitParameter("forceResponseEncoding","true");
        //设置过滤器的过滤规则 isMatchAfter: true,在其他过滤器执行之后进行过滤,fase: 优先执行
        dynamic.addMappingForUrlPatterns(null,true,"/*");
    }

    /**
     * 指定子容器的配置类
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    /**
     * 定义核心控制器的拦截规则
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

全部配置完成后,项目的打包还需要进行一点,就是配置pom,确保其打包不会打因为缺少web.xml而异常;

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

版权声明:本文为m0_56356993原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。