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>