AOP
目标对象:即被代理对象
连接点:被拦截的对象(方法)。
切面:定义切点、各类通知和引入的内容
切点
使用正则表达式和指示器规则去匹配多个类的不同方法
通知:按照约定的流程下的方法
- 前置通知
- 后置通知
- 环绕通知
- 事后返回通知
- 异常通知
织入
通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按照约定将各类通知织入约定的流程的过程
IOC容器
依赖注入
将底层类作为参数传递给上层类,实现上对下的控制
Spring IOC
BeanFactory
接口的简单容器ApplicationContext
应用上下文
Bean
定义Bean
@Component |
Spring基础的注解,被Spring管理的组件或bean |
---|---|
@Repository |
用于持久层,数据库访问层,是用来直接访问数据库的 |
@Service |
用于服务层,处理业务逻辑 |
@Controller |
用于呈现层,(Spring MVC),暴露给前端的入口 |
注入bean
@Autowired |
默认是按照资源的类型(class)查找并注入 |
---|---|
@Resource |
默认是按照资源的名称(name)查找并注入 |
@Qualifier |
采用@Autowired 如果存在多个实现类的情况下,@Qualifier 注解通过资源名称确定唯一性 |
Bean的作用域
作用域类型 | 使用范围 | 作用域描述 |
---|---|---|
singleton |
所有Spring应用 | 默认值,IOC容器只存在单例 |
prototype |
所有Spring应用 | 每当从IOC容器中取出一个Bean,则创建一个新的Bean |
session |
Spring Web应用 | Http会话 |
application |
Spring Web应用 | Web工程生命周期 |
request |
Spring Web应用 | Web工程单次请求 |
globalSession |
Spring Web应用 | 在一个全局的HTTP Session中,一个Bean的定义对应一个实例。实践中基本不使用 |
Bean的加载逻辑
- 转换BeanName
- 从缓存中加载实例
- 实例化Bean
- 检查parentBeanFactory
- 初始化依赖的Bean
- 创建Bean
配置文件
-
使用单个配置的时候,使用它
下面2个是用于配置项很多,且相互之间有联系,配置扔进类里,并加上下面2个
-
使用之后,对象会自动的实例化
配置开发环境和生产环境的配置文件
正常项目属性配置
[项目属性配置]
application.properties文件设置配置[项目属性配置]
application.yml文件设置配置[项目属性配置]
自定义属性配置参数间引用[项目属性配置]
多环境动态配置
这次学习,使用的是application.yml
path: 项目/src/main/resources/ 下
总配置文件: application.yml
spring:
profiles:
active: dev
开发环境配置文件:application-dev.yml
server:
port: 8081
servlet:
context-path: /luckymoney
# 配置对象
limit:
minMoney: 0.01 # 配置最小红包金额
maxMoney: 9999 # 配置最高红包金额
description: 最少要发${limit.minMoney}元, 最多${limit.maxMoney}元 # 描述
生产环境配置项:application-prod.yml
:
server:
port: 8081
servlet:
context-path: /luckymoney
limit:
minMoney: 1
maxMoney: 9999
description: 最少要发${limit.minMoney}元, 最多${limit.maxMoney}元
红包配置类
path: 项目/src/main/java/包/LimitConfig.java
package com.imooc.luckymoney;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Component
@ConfigurationProperties(prefix = "limit")
public class LimitConfig {
private BigDecimal minMoney;
private String description;
private BigDecimal maxMoney;
public BigDecimal getMinMoney() {
return minMoney;
}
public void setMinMoney(BigDecimal minMoney) {
this.minMoney = minMoney;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public BigDecimal getMaxMoney() {
return maxMoney;
}
public void setMaxMoney(BigDecimal maxMoney) {
this.maxMoney = maxMoney;
}
}
Controller的使用
@Controller
:处理http
请求@RestController
:Spring4
之后新加的注解,原来返回json
需要@ResponseBody
配合@Controller
@RequestMapping
:配置url
映射@GetMapping
: 新版url
映射
@Controller + @ResponseBody = @RestController
@PathVariable
:获取url
中的数据@RequestParam
:获取请求参数的值
红包接口实现
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
@RestController
public class LuckymoneyController {
@Autowired
private LuckymoneyRepository repository;
@Autowired
private LuckymoneyService service;
/**
* TODO: 获取红包列表
* @return List
*/
@GetMapping("/luckymoneys")
public List<Luckymoney> list() {
return repository.findAll();
}
@PostMapping("/luckymoney")
/**
* 创建红包
* @description: TODO: create luckymoney
* @author: Virus
* @date: 2020/1/18 21:30
* @param producer
* @param money
* @return com.imooc.luckymoney.Luckymoney
*/
public Luckymoney create(@RequestParam("producer") String producer,
@RequestParam("money") BigDecimal money) {
Luckymoney luckymoney = new Luckymoney();
luckymoney.setProducer(producer);
luckymoney.setMoney(money);
return repository.save(luckymoney);
}
@GetMapping("/luckymoneys/{id}")
/**
* @description: TODO: 通过id查找红包
* @author: Virus
* @date: 2020/1/18 21:34
* @param id
* @return com.imooc.luckymoney.Luckymoney
*/
public Luckymoney findById(@PathVariable("id") Integer id) {
// 查到直接返回对象,查不到返回null
return repository.findById(id).orElse(null);
}
@PutMapping("/luckymoneys/{id}")
/**
* @description: TODO: 更新红包
* @author: Virus
* @date: 2020/1/18 21:40
* @param id
* @param consumer
* @return com.imooc.luckymoney.Luckymoney
*/
public Luckymoney update(@PathVariable("id") Integer id,
@RequestParam("consumer") String consumer) {
// 先查询数据
Optional<Luckymoney> optional = repository.findById(id);
if (optional.isPresent()) {
Luckymoney luckymoney = optional.get();
// 修改数据
luckymoney.setConsumer(consumer);
return repository.save(luckymoney);
}
return null;
}
@PostMapping("/luckymoneys/two")
public void createTwo() {
service.createTwo();
}
}
事务
数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
服务
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
@Service
public class LuckymoneyService {
@Autowired
private LuckymoneyRepository repository;
@Transactional
/**
* 事务:指数据库事务
* @description: TODO
* @author: Virus
* @date: 2020/1/19 10:58
* @param * @param
* @return void
*/
public void createTwo() {
Luckymoney luckymoney1 = new Luckymoney();
luckymoney1.setProducer("test1");
luckymoney1.setMoney(new BigDecimal("520"));
repository.save(luckymoney1);
Luckymoney luckymoney2 = new Luckymoney();
luckymoney2.setProducer("test1");
luckymoney2.setMoney(new BigDecimal("1314"));
repository.save(luckymoney2);
}
}
thymeleaf
依赖
org.springframework.boot
spring-boot-starter-thymeleaf