feat(Java_SpringExample): 创建工程(代码有问题,先提交)

This commit is contained in:
huangzj
2020-05-22 18:02:41 +08:00
commit 456f0be8b5
17 changed files with 1933 additions and 0 deletions
@@ -0,0 +1,200 @@
package config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.context.WebApplicationContext;
import redis.clients.jedis.JedisPoolConfig;
import javax.sql.DataSource;
import java.io.IOException;
import java.util.Properties;
/**
* @author 志军
* 用@Configuration注解该类,等价 与XML中配置beans;用@Bean标注方法等价于XML中配置bean.
* 相当于applicationContext.xml文件
*
* 1.自动扫描web包 ,将带有注解的类 纳入spring容器管理
* 2.引入jdbc配置文件
* 3.dataSource 配置
* 4.mybatis文件配置,扫描所有mapper文件
* 5.spring与mybatis整合配置,扫描所有dao
* 6.对dataSource 数据源进行事务管理
* 7.配置使Spring采用CGLIB代理
* 8.启用对事务注解的支持
*/
@Configuration
@EnableTransactionManagement
@ComponentScan
public class ContextComponentLoader {
@Autowired
private SqlSessionFactory sqlSessionFactory;
/**
* 配置数据源
*/
@Bean
public DataSource dataSource() {
//这边数据库的配置需要根据对应的地址进行修改
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
driverManagerDataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:3306:ORCL");
driverManagerDataSource.setUsername("admin");
driverManagerDataSource.setPassword("admin");
//可以配置数据池的其他东西
return driverManagerDataSource;
}
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource x) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//設置dataSource
sqlSessionFactoryBean.setDataSource(x);
Properties properties = new Properties();
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = null;
try {
resources = pathMatchingResourcePatternResolver.getResources("dao/*.xml");
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactoryBean.setMapperLocations(resources);
sqlSessionFactoryBean.setConfigurationProperties(properties);
//全局设置返回的结果map不把null的参数去掉。这个好像局部设置会比较好一点
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setCallSettersOnNulls(true);
sqlSessionFactoryBean.setConfiguration(configuration);
try {
sqlSessionFactoryBean.afterPropertiesSet();
} catch (Exception e) {
e.printStackTrace();
}
return sqlSessionFactoryBean;
}
/**
* 配置mapper的掃描類
*/
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
Properties pro = new Properties();
/**這裡不是用Properties类来接收属性???*/
// pro.setProperty("basePackage","com.springmvc.test.mapper");
// pro.setProperty("sqlSessionFactoryBeanName","sqlSessionFactory");
/**mapper和dao放在一个包下面*/
/**setBasePackage的方法只能设置一个地址,
* 扫描mapper时找不到对应的Resposity时会报错,
* 但是扫描到Resposity没扫描到mapper不会报错*/
mapperScannerConfigurer.setBasePackage("dao");
// mapperScannerConfigurer.setBasePackage("com.springmvc.test.dao");
// mapperScannerConfigurer.setSqlSessionFactory(sqlSessionFactory);
mapperScannerConfigurer.setSqlSessionFactoryBeanName("getSqlSessionFactoryBean");
try {
return mapperScannerConfigurer;
} catch (Exception ex) {
System.out.println("发生错误");
ex.printStackTrace();
}
return mapperScannerConfigurer;
}
/**
* 配置mybatis的事务管理
*/
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
/**
* PersistenceExceptionTranslationPostProcessor是一个
bean 后置处理器(bean post-processor),它会在所有拥
有@Repository注解的类上添加一个通知器(advisor),这样就会
捕获任何平台相关的异常并以Spring非检查型数据访问异常的形式重
新抛出。
* */
@Bean
public BeanPostProcessor persistenceTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
/**
* 配置redis 的数据源、数据连接池、事务
*/
@Bean(name = "jedisPoolConfig")
public JedisPoolConfig createJedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// #最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
jedisPoolConfig.setMaxIdle(300);
// #连接池的最大数据库连接数。设为0表示无限制
jedisPoolConfig.setMaxTotal(600);
// #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
jedisPoolConfig.setMaxWaitMillis(5000);
// #在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
jedisPoolConfig.setTestOnBorrow(true);
return jedisPoolConfig;
}
@Bean(name = "jedisConnectionFactory")
public JedisConnectionFactory createJedisConnectionFactory(WebApplicationContext context) {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName("127.0.0.1");
jedisConnectionFactory.setPort(6379);
//redis好像是只有一个用户,默认是没有密码的,在控制台设置密码好像是暂时的,第二次重启的时候这个密码就会失效
//如果redis没有密码,就不要给这个参数进行设值操作,不然会报错,而且redis桌面应用中的密码和链接redis客户端的密码好像也会冲突
jedisConnectionFactory.setPassword("123456");
//连接池配置
jedisConnectionFactory.setPoolConfig((JedisPoolConfig) context.getBean("jedisPoolConfig"));
return jedisConnectionFactory;
}
/**
* redis操作模版,使用该对象可以操作redis
*/
@Bean(name = "redisTemplate")
public RedisTemplate createRedisTemplate(WebApplicationContext context) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory((RedisConnectionFactory) context.getBean("jedisConnectionFactory"));
// 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//开启事务
redisTemplate.setEnableTransactionSupport(true);
return redisTemplate;
}
}