关于配置(application.yml/preperties)
常规配置
server:
port: 9000
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/引用的数据库名
username:
password:
servlet:
multipart:
max-file-size: 10MB
# 单个文件最大
max-request-size: 100MB
# 多个文件最大
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 输出日志到控制台
map-underscore-to-camel-case: true
# 将"_"命名转为驼峰命名
引用配置的参数
在application.yml中
user:
info:
password: 100
name: Tom
address: beijing
@Data
@Component
@ConfigurationProperties("user.info")
public class UserConfig {
private String name;
private String password;
private String address;
}
发送请求
// json参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user) {
System.out.println(user.toString());
return "ok";
}
// 实体参数
@RequestMapping("/hello")
public String simpleParam(String name, Integer age) {
System.out.println(name + ":" + age);
return "OK";
}
// 日期参数
@RequestMapping("/DATA")
public String data(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
System.out.println(updateTime);
return "OK";
}
// 路径参数
@RequestMapping("/pathParam/{id}/{name}")
public String pathParam(@PathVariable Integer id, @PathVariable String name) {
System.out.println(id + " " + name);
return "ok";
}
// 数组参数
@RequestMapping("/array")
public String li(String[] hobby) {
System.out.println(Arrays.toString(hobby));
return "OK";
}
// 集合参数
@RequestMapping("/lists")
public String lis(@RequestParam List<String> hobby) {
System.out.println(hobby);
return "OK";
}
// 参数的映射 http://localhost:8080/test?name=hohn
@RequestMapping("/test")
public String tt(@RequestParam(name="name") String username) {
System.out.println(username);
return "ok";
}
//单个文件的上传
@PostMapping
public Result upload(String username, Integer age, MultipartFile image) throws Exception {
log.info("文件上传{}{}{}", username, age, image);
empService.saveFiles(username,age,image);
return Result.success();
}
事务
在类,方法,接口上加
@Transactional
开启事务
在启动类上加
@EnableTransactionManagement
//开启注解方式的事务管理
@Transactional(rollbackFor = Exception.class)
出现所有异常都回滚(默认出现RunTimeException才回滚)
事务传播行为
@Transactional(propagation = Propagation.REQUIRED)
属性值 | 含义 |
---|---|
REQUIRED | [默认值]需要事务,有则加入,无则创建新事务 |
REQUIRES_NEW | 需要新事务,无论有无,总是创建新事务 |
SUPPORTS | 支持事务,有则加入,无则在无事务状态中运行 |
NOT_SUPPORTS | 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务 |
MANDATORY | 必须有事务,否则抛异常 |
NEVER | 必须没事务,否则抛异常 |
AOP
类上添加@Aspect
通知类型
@Around:环绕通知
,在通知方法的前后都会被执行@Before
:前置通知,此注解标注的通知方法在目标方法前被执行@After
:后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行@AfterReturning
:返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行@AfterThrowing
:异常后通知,此注解标注的通知方法发生异常后执行
注:
除Around特殊外其他不用proceedingJoinPoint.proceed();
@Around("execution(* com.test.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
log.info("before");
Object result = proceedingJoinPoint.proceed(); //原始方法
log.info("after");
return result;
}
通知顺序
默认安装类名字母排序
@Order(int)
加在类上控制:数字越小越先执行通知前方法,越后执行通知后方法
切入点表达式
execution
@Pointcut("execution(方位修饰符 返回值 包名.类名.?方法名(方法参数) throws 异常?")
//"?"前的内容可省略
通配符:
*
:单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分
..
:多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数
常用
execution(* com.test.service.())
匹配com.test.service下任意返回值,任意一个方法参数的任意方法(不包括子级类)
execution(* com.test.service…(…))
匹配com.test.service下任意返回值,任意方法参数的任意方法(包括子级类)
提高复用:
@Pointcut("execution(* com.test.service.*(..))")
public void pt(){}
//引用
@Before("pt()")
public void test(){
log.info("test");
}
annotation
创建注解
@Retention(RetentionPolicy.RUNTIME)//运行时开始
@Target(ElementType.METHOD)//在方法上生效
public @interface MyLog {}
在要用的方法上加上@MyLog
引用:
@Before("@annotation(com.test.aop.MyLog)")
public void tt(){}
注解
@Getter
@Setter
@EqualsAndHashCode
@ToString
@Data
//代替以上注解
@NoArgsConstructor
//无参构造器
@AllArgsConstructor
//有参构造器
@Slf4j
//为类添加log,使用方法:log.info(“hello world!”);
bean,自动注入
Bean的声明
注解 | 说明 | 位置 |
---|---|---|
@Bean | 声明第三方bean | 声明第三方bean |
@Component | 声明bean的基础注解 | 不属于以下三类用此注解 |
@Controller(用@RestController返回json并作为响应发送给客户端) | @Component的衍生注解 | 标注在控制器上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Repository(用MyBatis框架@Mapper) | @Component的衍生注解 | 标注在数据访问类上上 |
位置:在类的上边 |
第三方bean的声明
@Configuration
public class CommonConfig {
@Bean
public SAXReader saxReader() {
return new SAXReader();
}
}
依赖注入
@Autowired
位置:在对象上
@Autowired
private Person person;
当同类型的bean存在多个:
@Primary // 定义优先级
位置:在Bean的声明上
@Autowired+@Qualifier (“bean的名称”)
@Resource(name=“bean的名称”)
项目结构
controller(表示层):主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。
命名:xxxController
service(业务层):主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。
命名:xxxService(接口)
命名:impl.xxxServicelmpl(实现类)
mapper(持久层):访问数据
pojo(对象类):放如实体对象
命名:xxxMapper(接口)
utils(工具):常用的工具