乐趣区

关于objective-c:SpringBoot架构关键词全解

一、外围配置文件

一个我的项目中 application.yml 和 application.properties 只能有一个。

(一)application.properties

# 设置内嵌 Tomcat 端口号
server.port = 8081

#设置上下文根
server.servlet.context-path = /springboot

(二)application.yml

YML 文件格式是 YAML (YAML Aint Markup Language) 编写的文件格式,YAML 是一种直观的可能被电脑辨认的的数据数据序列化格局,并且容易被人类浏览,容易和脚本语言交互的,能够被反对 YAML. YML 文件是以数据为外围的,比传统的 xml 形式更加简洁。

server:
    port: 8081
    servlet:
        context-path: 

二、获取 SpringBoot 自定义配置的字段

(一)通过 @Value 注解读取自定义配置字段

配置 application.properties

# 设置内嵌 Tomcat 端口号
server.port = 8081

#设置上下文根
server.servlet.context-path = /springboot

school.name = binSchool
websit=http://bninecoding.com

应用 @Value(“${school.name}”)

@Value(${school.name})
private String schoolName;

(二)将自定义配置映射成对象

波及注解:

@Component // 将此类交给 spring 容器进行治理
@ConfigurationProperties(prefix = "school")
@Autowired

配置 application.properties

server.servlet.context-path = /springboot

school.name = binSchool
school.websit = binSchool

abc.name = binSchool
abc.websit = binSchool

创立 school 类:

@Component
@ConfigurationProperties(prefix = "school")
public class School {
    private String name;
    private String websit;
    
    public String getName()  {retutrn name;}
    
    public void setname(String name) {this.name = name;}
    ...
}

因为 @Component 这样做之后曾经将 school 类加载到 spring 容器里了,所以应用时能够应用 @Autowired 注入进来:

public class IndexController  {
    
    @Autowired
    private School school;
    
    @RequestMapping(value = "/say")
    public @responseBody String say() {return "school.name=" + school.getName() + "---school.websit=" + school.getWebsit;
    }
}

三、SpringBoot 集成 jsp

(一)环境集成

配置视图解析器,application.properties:

spring.mvc.view.prefix = /
spring.mvc.view.suffix = .jsp

(二)应用 jsp

注:求教了做前后端的同学,当初根本不必 jsp 了,jsp 是后端做前端的问题,当初都交给前端做了,也就是迁到 Vue 了。

1. 配置接口

@RequestMapping(value = "/say")
public ModelAndView say() {ModelAndView mv = new ModelAndView();
    mv.addObject("message","Hello,SpringBoot");
    mv.setViewName("say");
    return mv;
}

2. 创立页面

拜访新创建的页面:

四、集成 Mybatis

MyBatis 是一款优良的长久层框架,它反对自定义 SQL、存储过程以及高级映射。MyBatis 罢黜了简直所有的 JDBC 代码以及设置参数和获取后果集的工作。MyBatis 能够通过简略的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,一般老式 Java 对象)为数据库中的记录。

(一)增加 Mybatis 依赖,MySQL 驱动(略)

(二)Mybatis Generator 主动生成代码(略)

在 renren-fast 我的项目中能够应用 renren-fast-generate 主动生成前后端的代码。

(三)Dao 和 Mapper

应用 MyBatis 开发 Dao,通常有两个办法,即原始 Dao 开发方法和 Mapper 动静代理开发方法。

DAO 层叫数据拜访层,全称为 data access object,属于一种比拟底层,比拟根底的操作,具体到对于某个表的增删改查,也就是说某个 DAO 肯定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,倡议 DAO 只做原子操作,增删改查。

Service 层叫服务层,被称为服务,粗略的了解就是对一个或多个 DAO 进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,须要事物管制。

应用 mapper 代理的办法来开发 dao 时,程序员只须要干两件事即可,比应用原始 Dao 开发更加:

1、编写 mapper.xml 映射文件
2、编写 mapper 接口(相当于 dao 接口)

五、SpringBoot 罕用注解

@RestController

相当于管制层类上加 @Controller + 所有办法上加 @ResponseBody。

意味着以后管制层类中所有办法返回的都是 JSON 对象

@RequestMapping

@RequestMapping = @GetMapping + @PostMapping

  • @PostMapping:减少数据 应用
  • @DeleteMapping:删除数据 应用
  • @PutMapping:批改数据 应用
  • @GetMapping:查问数据 应用

那每一个接口都要辨别 增删改查 吗?

工作中没有明确要求,用哪个都行,平时用得最多的是 Post

六、RESTful

REST 英文:Representational State Transfer,它是一种架构设计的格调,但它并不是规范,它只是提出了一组客户端和服务器交互式的架构理念和设计准则,基于这种理念和准则设计的接口能够更简洁,更有档次。

任何的技术都能够实现这个理念,如果一个架构合乎 REST 准则,就称它为 RESTFul 架构,RESTful 中 path 尽量应用名词,不要应用动词。

比方咱们要拜访一个 http 接口:http://localhost:8080/boot/or…

采纳 RESTFul 格调则 http 地址为:http://localhost:8080/boot/or…

(一)原始 HTTP 解析参数的写法

@RequestMapping(value = "/student")
public Object student(Integer id, Integer age) {Student stuent = new Student();
    student.setId(id);
    student.setAge(age);
    return student;
}

而后拜访地址:localhost:8080/student?id=1001&age=23

(二)RESTful 写法

@PathVariable:门路变量,取门路里的值

@RequestMapping(value = "/student/detail/{id}/{age}")
public Object student(@PathVariable("id") Integer id,
                    @PathVariable("age") Integer age) {Map<String,Object> retMap = new HashMap<>();
    retMap.put("id",id);
    retMap.put("age",age);
    return retMap;
}

拜访地址:localhost:8080/student/detail/1010/28

能够发现:RESTful 更平安了一点,如果不是开发者,调用方不晓得参数是什么意思。

但应用 RESTful 还会存在问题:

@RequestMapping(value = "/student/detail/{id}/{age}")
public Object student(@PathVariable("id") Integer id,
                    @PathVariable("age") Integer age) {Map<String,Object> retMap = new HashMap<>();
    retMap.put("id",id);
    retMap.put("age",age);
    return retMap;
}

@RequestMapping(value = "/student/detail/{id}/{status}")
public Object student(@PathVariable("id") Integer id,
                    @PathVariable("status") Integer status) {Map<String,Object> retMap = new HashMap<>();
    retMap.put("id",id);
    retMap.put("status", status);
    return retMap;
}

以上代码 student1 和 student2 会呈现申请门路迷糊的谬误,
比方申请门路:localhost:8080/student/detail/1010/28

因为没有明确指明变量名,所以也无奈通晓这个申请是连向 id-age 还是 id-status。

通常在 RESTful 格调中办法的申请形式会按 增删改查 的申请形式来辨别,比方能够这么批改:

// @RequestMapping(value = "/student/detail/{id}/{age}")
@GetMapping(value = "/student/detail/{id}/{age}")
public Object student(@PathVariable("id") Integer id,
                    @PathVariable("age") Integer age) {Map<String,Object> retMap = new HashMap<>();
    retMap.put("id",id);
    retMap.put("age",age);
    return retMap;
}

/// @RequestMapping(value = "/student/detail/{id}/{status}")
@DeleteMapping(value = "/student/detail/{id}/{status}")
public Object student(@PathVariable("id") Integer id,
                    @PathVariable("status") Integer status) {Map<String,Object> retMap = new HashMap<>();
    retMap.put("id",id);
    retMap.put("status", status);
    return retMap;
}

如果两个都是 GET 申请,那就依据申请的意思批改 path 门路。

RESTful 经常出现下面门路反复的问题,解决形式有:

  • 批改申请形式
  • 批改 path 门路

RESTful 小结

我的项目中用不必 RESTful 根本不是你能决定的,我的项目如果采纳 RESTful,那你就用 RESTful,我的项目不必你也用不了。

七、Redis

(一)什么时候须要用 Redis 呢?

  • 不须要实时更新然而又极其耗费数据库的数据。比方网站上商品销售排行榜,这种数据一天统计一次就能够了,用户不会关注其是否是实时的。
  • 须要实时更新,然而更新频率不高的数据。比方一个用户的订单列表,他必定心愿可能实时看到本人下的订单,然而大部分用户不会频繁下单。
  • 在某个时刻访问量极大而且更新也很频繁的数据。这种数据有一个很典型的例子就是秒杀,在秒杀那一刻,可能有 N 倍于平时的流量进来,零碎压力会很大。然而这种数据应用的缓存不能和一般缓存一样,这种缓存必须保障不失落,否则会有大问题。

个别地,Redis 能够用来作为 MySQL 的缓存层。为什么 MySQL 最好有缓存层呢?

设想一下这样的场景:在一个多人在线的游戏里,排行榜、好友关系、队列等间接关系数据的情景下,如果间接和 MySQL 侧面交手,大量的数据申请可能会让 MySQL 疲惫不堪,甚至适量的申请将会击穿数据库,导致整个数据服务中断,数据库性能的瓶颈将掣肘业务的开发;那么如果通过 Redis 来做数据缓存,将大大减小查问数据的压力。在这种架子里,当咱们在业务层有数据查问需要时,先到 Redis 缓存中查问,如果查不到,再到 MySQL 数据库中查问,同时将查到的数据更新到 Redis 里;当咱们在业务层有批改插入数据需要时,间接向 MySQL 发动申请,同时更新 Redis 缓存。

(二)配置 redis

application.properties 配置:

# 设置 redis 配置信息
spring.redis.host = 192.168.154.128
spring.redis.port = 6379
spring.redis.password = 123456

(三)应用 redis

// 应用 redis 业务逻辑
@Controller
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping(value = "/put")
    public @ResponseBody Object put(String key, string value) {studentService.put(key,value);
        return "值已胜利放入 redis"
    }
    
    @RequestMapping(value = "/get")
    public String get() {String count = studentService.get("count");
        return "数据 count 为:" + count;
    }
}

@Service
public class StudentServiceImpl implements StudentService {
    
    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;
    
    @Override
    public void put(String key, String value) {redisTemplate.opsForValue().set(key,value);
    }
    
    @Override
    public String get(String key) {String count = redisTemplate.opsForValue().get(key)
         return count;
    }
}
退出移动版