我的第一个项目总结

SpringBoot

记录下工作中的第一个springboot项目中遇到的一些问题和解决办法,以及总结下从中获得的东西。

@RestController

@RestController是@Controller和@ResponBody两个注解的简写方式。@ResponseBody注解使得返回结果以json形式返回。

  1. RESTful风格 通过使用@RequestMapping("/uri")注解来分配uri到相应的方法中,默认是GET方法。也可以使用@PostMapping("/uri"),@GetMapping("/uri")等直接指定请求方式;

  2. 使用继承方式使Controller的接口抽象出来

  3. POST请求方式的参数需要用@RequestBody修饰

  4. 引入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属性为方法注解

  5. @RequestBody
    @RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

作用:
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

  1. @ResponseBody
    @Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。

作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

  1. @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

项目经验总结

  1. 首先熟悉项目业务逻辑
  2. 代码写注解和输出日志
  3. 完成每个功能后,要做测试
  4. 细心细心,事不过三
  5. 积极主动
  6. 多接触新技术,学会使用,了解底层实现
  7. 遇事沉着冷静
  8. 根据业务逻辑慎重抛出异常
  9. 了解各个模块的功能以及之间的调用关系
  10. 一些重要信息应写在wiki上供他人知晓。例如,上线前准备的信息(数据库清除,数据库增删字段,手工维护的一些信息等)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值