前篇聊到:基于xml配置的SSM框架整合
现在来谈谈如何构建基于Java代码的SSM框架,即不使用xml配置
核心:
AbstractAnnotationConfigDispatcherServletInitializer
WebMvcConfigurerAdapter
BasicDataSource
SqlSessionFactory
Logger
Eclipsse构建的项目结构:
1.导jar:
spring-core.jar spring-beans.jar spring-context.jar spring-aop.jar spring-expression.jar
spring-web.jar spring-context-support.jar spring-webmvc-4.3.9.RELEASE.jar
spring-tx.jar spring-jdbc.jar mybatis-spring.jar
mybatis.jar commons-pool.jar commons-dbcp.jar mysql-connector-java.jar
log4j.jar commons-logging.jar
2.建立 类-表 对应关系
一般包名xxx/dao/beans
3.继承AbstractAnnotationConfigDispatcherServeltInitializer类并实现父类规定的三个方法-应用程序初始化类-SSMApplicationInitializer.java:
//应用程序初始化类
public class SSMApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
//Spring的配置类
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
//Spring MVC的配置类
return new Class[]{SpringMVCConfig.class};
}
@Override
protected String[] getServletMappings() {
//返回映射到DispatcherServlet的请求路径
return new String[]{"/"};
}
4.SpringMVC的配置类-SpringMVCConfig.java:
//SpringMVC的配置类
@Configuration
@EnableWebMvc
@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class))
public class SpringMVCConfig extends WebMvcConfigurerAdapter{
//添加视图控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
//配置视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//定义了一个内部资源视图解析器(InternalResourceViewResolver)
registry.jsp("/", ".jsp"); //自动添加prefix前缀和suffix后缀
}
//配置tomcat原ServletHandling-直观体现-图片的正常显示
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
5.加入Log4j日志jar包-在src目录下放置log4j.properties:
log4j.rootLogger=WARN,stdOut
log4j.appender.stdOut=org.apache.log4j.ConsoleAppender
log4j.appender.stdOut.layout=org.apache.log4j.PatternLayout
log4j.appender.stdOut.layout.conversionPattern=%d %5p (%c:%L) - %m%n
# 自定义 my logger
log4j.logger.com.demo=DEBUG
log4j.appender.myFile=org.apache.log4j.FileAppender
log4j.appender.myFile.file=d:/temp_log.log
log4j.appender.myFile.layout=org.apache.log4j.PatternLayout
log4j.appender.myFile.layout.conversionPattern=%d [%c]-[%-5p]%m%n
6.Mybaits配置类-MyBatisConfig.java:
//Mybaits配置类
@Configuration
@MapperScan(basePackages = "com.demo.ssm.mapper")
public class MyBatisConfig {
private static Logger logger = Logger.getLogger(MyBatisConfig.class);
//配置数据源
@Bean(name = "dataSource",destroyMethod = "close")
public BasicDataSource basicDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //JDBC驱动类的全限定类名
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/xxx"); //连接数据库
dataSource.setUsername("xxx"); //数据库账号
dataSource.setPassword("xxx"); //密码
//池配置属性
dataSource.setInitialSize(3); //池启动时创建的连接数量
dataSource.setMaxActive(50); //同一时间可分配的最多连接数,0-表示无限制
dataSource.setMaxIdle(3); //最多空闲连接数,0-表示无限制
dataSource.setMinIdle(1); //不创建新连接情况下,保持空闲的最小连接数
dataSource.setMaxWait(4000); //等待连接回收的最大时间,-1-表示无限制
dataSource.setDefaultAutoCommit(false); //设置事务非自动提交
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//设置要使用的数据源
factoryBean.setDataSource(dataSource);
SqlSessionFactory factory = null;
//设置sml文件中的类所在包
factoryBean.setTypeAliasesPackage("com.demo.ssm.beans");
//为了让myBit自动将下划线分隔的列名转换为驼峰表示的属性名
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
factoryBean.setConfiguration(configuration);
try {
//设置映射xml文件的路径
Resource[] resources= new PathMatchingResourcePatternResolver().getResources("classpath:com/demo/ssm/*Mapper.xml");
factoryBean.setMapperLocations(resources);
factory =factoryBean.getObject();
} catch (Exception e) {
logger.error("解析映射xml文件时异常:"+e.getMessage());
}
return factory;
}
}
7.Spring的配置类-SpringConfig.java:
//Spring的配置类
@Configuration
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class))
@EnableTransactionManagement
public class SpringConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}