第一个项目总结
SpringBoot
记录下工作中的第一个springboot项目中遇到的一些问题和解决办法,以及总结下从中获得的东西。
@RestController
@RestController是@Controller和@ResponBody两个注解的简写方式。@ResponseBody注解使得返回结果以json形式返回。
-
RESTful风格 通过使用@RequestMapping("/uri")注解来分配uri到相应的方法中,默认是GET方法。也可以使用@PostMapping("/uri"),@GetMapping("/uri")等直接指定请求方式;
-
使用继承方式使Controller的接口抽象出来 ;
-
POST请求方式的参数需要用@RequestBody修饰 ;
-
引入Swagger2方便技术文档维护
首先在xml文件中引入swagger的jar包<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency>
其次在方法上添加@ApiOperation注解,value属性为方法注解
-
@RequestBody
@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
作用:
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
- @ResponseBody
@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
- @RequestMapping
@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;
用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法。
此处需注意@RequestMapping用在类上可以有,但是用在方法上必须有。
SpringBoot整合MyBatis
使用 @Component("proxyConfigBean") 注解修饰类,生成Bean对象
@Value注解从配置文件中获取相应变量名的数值
(org.springframework.beans.factory.annotation.Value)
@Value("${jdbc.ytproxy.url}")
private String ytUrl;
@Value("${jdbc.ytproxy.username}")
private String ytUsername;
@Value("${jdbc.ytproxy.password}")
private String ytPassword;
@Value("${jdbc.package.url}")
private String packageUrl;
@Value("${jdbc.package.username}")
private String packageUsername;
@Value("${jdbc.package.password}")
private String packagePassword;
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${druid.filters}")
private String g2linkJobFilters;
@Value("${jdbc.initialSize}")
private Integer g2linkJobJdbcInitialSize;
@Value("${jdbc.maxActive}")
private Integer g2linkJobJdbcMaxActive;
@Value("${jdbc.minIdle}")
private Integer g2linkJobJdbcMinIdle;
@Mapperscan指定要扫描的Mapper类的包的路径。省去给每个Mapper类注释@Mapper。
value表明包的路径,sqlSessionFactoryRef表明调用哪个SqlSessionFactory类。
@Configuration
@MapperScan(value = "cn.g2link.dms.dmsytproxy.dao.packagemapper", sqlSessionFactoryRef = "packageFactory")
public class PackageDBConfig {
@Autowired
AppConfigBean packageDBBean;
// 配置数据源(Druid)
// @Primary注解表示存在同名bean对象时,优先使用有@Primary注解的bean对象
@Primary
@Bean(name = "packageDataSource")
public DataSource packageDataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(packageDBBean.getPackageUrl());
dataSource.setDriverClassName(packageDBBean.getDriverClassName());
dataSource.setUsername(packageDBBean.getPackageUsername());
dataSource.setPassword(packageDBBean.getPackagePassword());
dataSource.setFilters(packageDBBean.getG2linkJobFilters());
dataSource.setMaxActive(packageDBBean.getG2linkJobJdbcMaxActive());
dataSource.setMinIdle(packageDBBean.getG2linkJobJdbcMinIdle());
dataSource.setInitialSize(packageDBBean.getG2linkJobJdbcInitialSize());
return dataSource;
}
// 配置Mybatis的核心类
@Bean(name = "packageFactory")
public SqlSessionFactory packageFactory(@Qualifier("packageDataSource") DataSource dataSource) throws SQLException {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 该属性可以给包中的类注册别名,注册后可以直接使用类名,而不用使用全限定的类名(就是不用包含包名)。
factoryBean.setTypeAliasesPackage("cn.g2link.dms.dmsytproxy.dao.packagedao");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
// 设置mapper.xml文件路径
factoryBean.setMapperLocations(resolver.getResources("classpath*:/META-INF/packagemybatis/*.xml"));
factoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return factoryBean.getObject();
} catch (Exception e) {
log.warn("get packageFactory failed, errorMessage:{}", e);
throw new RuntimeException(e);
}
}
// 配置事物管理器
@Bean(name = "packageTransactionManager")
public DataSourceTransactionManager packageTransactionManager(@Qualifier("packageDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
Netty入门
需要了解netty机制,底层原理。。。
事件驱动,异步通信的框架
SpringBoot之CommandLineRunner接口
在程序启动的时候
@Component
@Slf4j
public class MessageServerRunner implements CommandLineRunner{
@Override
public void run(String... args) throws Exception {
// 重写run方法
log.info("启动ytproxy nettyServer...");
}
}
运行后的日志:
INFO c.g.d.d.command.MessageServerRunner - 启动ytproxy nettyServer...
INFO c.g.d.d.DmsYtproxyApplication - Started DmsYtproxyApplication in 35.519 seconds (JVM running for 46.881).
实现了CommandLineRunner接口的Component会在所有Spring Beans都初始化之后,SpringApplication.run()之前执行,非常适合在应用程序启动之初进行一些数据初始化的工作。
接触的新事物
@Data(lombok)
@Builder
@Slf4j
Postman工具
Docker命令
Sqlite3
项目经验总结
- 首先熟悉项目业务逻辑
- 代码写注解和输出日志
- 完成每个功能后,要做测试
- 细心细心,事不过三
- 积极主动
- 多接触新技术,学会使用,了解底层实现
- 遇事沉着冷静
- 根据业务逻辑慎重抛出异常
- 了解各个模块的功能以及之间的调用关系
- 一些重要信息应写在wiki上供他人知晓。例如,上线前准备的信息(数据库清除,数据库增删字段,手工维护的一些信息等)。