SpringBoot学习

springboot集成测试
创建控制层

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String index(){
        return "Hello";
    }
}

创建测试类

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class HelloApplicationTests {
    @LocalServerPort
    private int port;
    private URL base;
    @Autowired
    private TestRestTemplate template;
    @BeforeEach //这是Junit5的注解
    public void setUp() throws Exception{
        this.base = new URL("http://localhost:"+port+"/hello");
    }
    @Test
    public void test1(){
        ResponseEntity<String> response= template.getForEntity(base.toString(),String.class);
        assertThat(response.getBody(),equalTo("Hello"));
        System.out.println("ok");
    }
}

解决yml中乱码问题
在这里插入图片描述
读取application.yml中的自定义属性

my:
  name: cheng
  sex: 男

创建代码测试

   @Value("${my.name}")
    private String name;
    @Value("${my.sex}")
    private String sex;

    @RequestMapping("test")
    public String test(){
        return name+":"+sex;
    }

当属性较多时写一个配置类JavaBean存放属性
application.yml

my:
  name: cheng
  sex: 男
  number: ${random.int}
  uuid: ${random.uuid}
  #随机生成一个小于10的整数
  max: ${random.int(10)}
  value: ${random.value}
  sayhi: hi,i'm ${my.name}

JavaBean类,@ConfigurationProperties注解表明该类是个配置类
lombok依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
</dependency>
@Data
@Accessors(chain = true)  //lombok中链式编程
@ConfigurationProperties(prefix = "my")   
@Component
public class ConfigBean {
    private String name, sex, uuid, value, sayhi;
    private int number, max;
}

@RestController
@EnableConfigurationProperties({ConfigBean.class})
public class HelloController {
    @Autowired
    ConfigBean configBean;
    @RequestMapping(value = "mytest")
    public String  mytest(){
//        ConfigBean configBean = this.configBean.setMax(3).setName("cheng").setSex("nan").setValue("abc"); 体现链式编程
        return configBean.getName()+":"+configBean.getSex()+":"+configBean.getMax();
    }
}

自定义配置文件
当属性更多时,可以单独写文件,my.properties

com.my.name=cheng
com.my.sex=男

配置类

@Configuration
@PropertySource(value = "classpath:my.properties")
@ConfigurationProperties(prefix = "com.my")
@Data
public class User {
    private String name,sex;
}

测试类

@RestController
@EnableConfigurationProperties({ConfigBean.class, User.class})
public class HelloController {
    @Autowired
    User user;
    @RequestMapping("/mytest1")
    public String mytest1(){
        return user.getName()+user.getSex();
    }
}

springboot中多环境的配置
文件配置格式application-{profile}.properties.如:
application-test.properties
application-dev.properties
application-prod.properties
在application.yml中添加spring.profiles.active使用即可,如使用test

spring:
  profiles:
    active: test

application-test.properties

server.port=8085

java -jar也可以启动程序

java -jar hello-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro

springboot中Actuartor监控
依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.properties配置

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.shutdown.enabled=true
management.server.port=9000

访问时路径上添加 /actuator前缀才能访问,如 http://localhost:9000/actuator/health

常见端点
在这里插入图片描述
SpringBoot整合JPA
添加依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
</dependency>

在mysql数据中创建一个runnoob的数据库,配置properties.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/runoob?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=GMT%2B8
    username: root
    password: 123456
  jpa:
    hibernate:
#      第一次建表时用create,后面用update,每次重启项目会删除对应的数据表并从新创建
      ddl-auto: create
#      显示操作sql语句
    show-sql: true

创建实体类

@Entity
@Data
@Accessors(chain = true)
public class User {
    @Id
//    该注解表明id字段为自增长
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable = false,unique = true)
    private String username;
    @Column
    private String password;
}

创建dao

@Component  //该注解加不加不影响
public interface UserDao extends JpaRepository<User,Long> {
    User findByUsername(String username);
}

创建service

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    public User findUserByName(String username){
        return userDao.findByUsername(username);
    }
}

创建Controller

@RestController
public class HelloController {
    @Autowired
    UserService userService;
    @GetMapping("user/{username}")
    public User getUserName(@PathVariable("username") String name){
        return userService.findUserByName(name);
    }
}

运行程序:
Hibernate: drop table if exists userHibernate: create table user (id bigint not null auto_increment, password varchar(255), username varchar(255) not null, primary key (id)) engine=InnoDBHibernate: alter table user add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username)

数据表中插入自己的数据访问即可。

INSERT INTO user (password,username) VALUES("123456","hh");

SpringBoot整合redis
添加依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yml配置

spring:
  redis:
    host: localhost
    port: 6379
    password:
    database: 5

创建dao,该类中通过RedisTemplate来访问Redis数据库

@Repository
public class RedisDao {
    @Autowired
    private StringRedisTemplate redisTemplate;
    public void setKey(String key,String value){
        ValueOperations<String, String> stringStringValueOperations = redisTemplate.opsForValue();
        stringStringValueOperations.set(key,value,1, TimeUnit.MINUTES);//一分钟过期
    }
    public String getValue(String key){
        ValueOperations<String, String> stringStringValueOperations = redisTemplate.opsForValue();
        return stringStringValueOperations.get(key);
    }
}

测试

@Autowired
private RedisDao redisDao;
@Test
public void test(){
	edisDao.setKey("username","cc");
    System.out.println(redisDao.getValue("username"));
}

SpringBoot整合Swagger2
添加依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.6.1</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.6.1</version>
</dependency>

创建配置类

@Configuration
@EnableSwagger2
public class Swagger2 {
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.cc.hello.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("Swagger2文档")
                .description("restful风格项目,https://blog.csdn.net/weixin_40911000/article/details/107500798")
                .termsOfServiceUrl("https://blog.csdn.net/weixin_40911000/article/details/107500798")
                .version("1.0")
                .build();
    }
}

实体类

@Entity
@Data
@Accessors(chain = true)
public class User {
    @Id
//    该注解表明id字段为自增长
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable = false,unique = true)
    private String username;
    @Column
    private String password;
}

dao层

public interface UserDao extends JpaRepository<User,Long> {
    User findByUsername(String username);
}

service层


@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    public User findUserByName(String username){
        return userDao.findByUsername(username);
    }
    public List<User> finAll(){
        return userDao.findAll();
    }
    public User findUserById(Long id){
        Optional<User> userOptional=userDao.findById(id);
        return  userOptional.get();
    }
    public User saveUser(User user){
        return userDao.save(user);
    }
    public User updateUser(User user){
        return userDao.saveAndFlush(user);
    }
    public void deleteUser(long id){
        userDao.deleteById(id);
    }
}

controller层

@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    UserService userService;
    @ApiOperation(value ="所有用户",notes = "查询所有用户")
    @RequestMapping(value = "",method = RequestMethod.GET)
    public List<User> getUsers(){
        List<User> users=userService.finAll();
        return users;
    }
    @ApiOperation(value = "创建用户",notes = "创建用户")
    @RequestMapping(value="",method = RequestMethod.POST)
    public User postUser(@RequestBody User user){
        return userService.saveUser(user);
    }
    @ApiOperation(value = "查询用户",notes = "根据id查询用户")
    @RequestMapping(value="/{id}",method = RequestMethod.GET)
    public User getUerById(@PathVariable Long id){
        return userService.findUserById(id);
    }
    @ApiOperation(value = "跟新用户",notes = "根据id更新用户")
    @RequestMapping(value="/{id}",method = RequestMethod.PUT)
    public User putUser(@PathVariable Long id,@RequestBody User user){
        User user1=new User();
        user1.setUsername(user.getUsername());
        user1.setPassword(user.getPassword());
        user1.setId(id);
        return userService.updateUser(user1);
    }
    @ApiOperation(value = "删除用户",notes = "根据id删除用户")
    @RequestMapping(value="/{id}",method = RequestMethod.DELETE)
    public String deleteUser(@PathVariable Long id){
        userService.deleteUser(id);
        return "sucess";
    }
    @ApiIgnore //该注解忽略这个API
    @RequestMapping(value="/hello",method = RequestMethod.GET)
    public String Hello(){
        return "hello!";
    }
}

启动项目访问http://localhost:8080/swagger-ui.html
在这里插入图片描述

Swagger2文档常用注解
@Api:修饰整个类,用于描述Controller类
@ApiOperation:描述类的方法,或者说一个借口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiRespone:HTTP相应的一个描述
@ApiRespones:HTTP响应的整体描述
@ApiIgnore:使用该注解,表示Swagger2忽略这个API
@ApiError:发生错误返回的信息
@ApiParamImplicit:一个请求参数
@ApiParamsImplicit:多个请求参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值