spring 是目前 java 开发比较热门的框架, 配置 boot 和 cloud 能够快速打造出一个 restful 项目
spriing 项目中主要用到的组件有 br/>1:@Controller: 控制器, 用来绑定 url 和对应的处理方法,@RestController
2:@Service: 一个组件, 主要用来做处理业务逻辑 br/>3:@Repository: 主要是用作数据处理层
4:@Component: 一般的组件
项目实战: 一个基础的项目代码
1: 添加 spring-cloud 依赖:
- <properties>
- <spring-cloud.version>Finchley.SR2</spring-cloud.version>
- </properties>
- <repositories>
- <repository>
- <id>spring-milestones</id>
- <name>Spring Milestones</name>
- <url>https://repo.spring.io/milestone</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.0.RELEASE</version>
- </parent>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
2: 引入 web 包和响应式包, 响应式是非阻塞 IO 的一种实现, 在 servlet 请求的时候会把业务处理过程挂起, 然后处理完成获得结果了才重新激活 servlet 线程返回结果. 这样的好处是提高了线程处理能力, 提高了并发处理. br/>3: 声明一个 REST 控制器, 声明后返回的数据默认是 JSON 格式
- @RestController
- @RequestMapping("/myurl") // 绑定一个 url 前缀
- public class MyController[
- @GetMapping("/api-a")
- public Mono<Object> testA() {
- return Mono.just("hello");br/>
- }
- }
当请求 / myurl/API-a 时, 返回 JSON 数据是 hello
路径匹配规则: 可以使用正则已经 ant 风格的匹配模式, 多个路径都符合时以最长匹配路径为最优选择.
4: 声明一些接口然后添加实现类, 并注解 @Service 或者 @Repository
5: 启动类: br/>@SpringApplication
- public class AppStarter {
- public static void main(String[] args)
- }
- SpringApplication.run(AppStarter.class, args);
- } mailto:br/%3E@SpringApplication%3Cbr/
配合 mybatis 操作数据库
略
使用 amqp 操作 rabbitmq 消息服务
mailto:br/>@SpringApplication
1: 引入依赖
- <dependency>
- <groupId>
- org.springframework.boot
- </groupId>
- <artifactId>
- spring-boot-starter-amqp
- </artifactId>
- </dependency>
2: 使用组件注解的方式侦听消息队列: mailto:br/>@SpringApplication
- public class OrderMessageHandler { mailto:br/%3E@Component%3Cbr/
- @RabbitListener(queues = {"OrderToCreate"})
- public void handleMessage(MessageBodyDTO payload, @Header(AmqpHeaders.CHANNEL) Channel channel,
- @Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag) throws IOException {
- channel.basicAck(deliveryTag, false);
- }
- mailto:br/%3E@Component%3Cbr/
- }
3: 需要手动确认消息的, 要配置:
spring.rabbitmq.listener.simple.acknowledge-mode=manual
然后在接收消息的地方进行手动确认 channel.basicAck(deliveryTag, false); 如果出错不确认则会把消息卡住, unack 消息会出现, 然后接收不到之后的消息. mailto:br/>@Component
- @Autowired
- private RabbitTemplate amqpTemplate;
然后调用 amqpTemplate.convertAndSend(body.getExchange(), body.getRoutingKey(), body); 即可
操作 feign
feign 是一个封装好的 http 客户端调用, 能够快速地调用 REST API 的内容 br/>1: 引入依赖
2: 在配置类上添加:@EnableFeignClients
3: 声明一个接口, 接口上注解 @FeignClient()br/>@FeignClient(name="myfeign",url="http://localhost/api-a"),
还可以配置 decode 和 encode 对请求的参数和响应的结果进行编码. 默认使用的是 string, 当需要请求对象或者返回对象时则需要重新编码构造.
4: 在方法上注解 @RequestMapping("/myrul") 来确定请求的实际路径和方法 mailto:br/>@FeignClient(name=
操作 Cache
略
- AOP
- mailto:br/%3E@FeignClient(name=
1: 声明一个切面组件 mailto:br/>@FeignClient(name= br/>@Component
- @Aspect
- public class MyAspect {
- }
2: 在切面里声明切点
- @Pointcut("execution(com.seasfood.producer...*(..))")
- void myMethod() {
- mailto:br/%3E@Component%3Cbr/ br/>
- }
3: 声明通知, 即切入之后要在哪个点位进行处理, 主要用的 before,after,around 等
- @Before("myMethod()")
- void doCheck(JoinPoint joinPoint) {
- // 做些什么
- }
- @Around
来源: http://www.bubuko.com/infodetail-2985673.html