• Spring boot通常有⼀个名为 xxxApplication的类,⼊⼝类中有⼀个main⽅法, 在main⽅法中使⽤ **SpringApplication.run(xxxApplication.class,args)**启 动springboot应⽤的项⽬。
  • @RestController: 就是 @Controller+@ResponseBody 组合,⽀持RESTful访问⽅ 式,返回结果都是json字符串。
  • @SpringBootApplication 注解等价于:
    • @SpringBootConfiguration 标识注解,标识这是⼀个springboot的配置类
    • @EnableAutoConfiguration ⾃动与项⽬中集成的第三⽅技术进⾏集成
    • @ComponentScan 扫描⼊⼝类所在⼦包以及⼦包后代包中注解

配置文件的拆分


拆分如下:
 #主配置⽂件:
 application.yml #⽤来书写相同的的配置
 server:
    port: 8080 #⽣产和测试为同⼀个端⼝

 #⽣产配置⽂件:
 application-pord.yml
 server:
    context-path: /abcd
 #测试配置⽂件:
 application-dev.yml
 server:
    context-path: /springboot
  • 使⽤ @Repository @Service @Controller 以及 @Component管理不同简单对象 如: ⽐如要通过⼯⼚创建⾃定义User对象:
@Component
@Data
public class User {
 private String id;
 private String name;
 ......
}
// 通过⼯⼚创建之后可以在使⽤处任意注⼊该对象 如:在控制器中使⽤⾃定义简单对象创建
@Controller
@RequestMapping("hello")
public class HelloController {
 @Autowired
 private User user;
 ......
}
  • @Configuration @Bean
  • 管理复杂对象的创建
@Configuration(推荐)|@Component(不推荐)
public class Beans {
 @Bean
 public Calendar getCalendar(){
 return Calendar.getInstance();
 }
}
  1. @Configuration 配置注解主要⽤来⽣产多个组件交给⼯⼚管理 (注册形式)
  2. @Component ⽤来管理单个组件(包扫描形式)
  • @Value
@Controller
@RequestMapping("hello")
public class HelloController {

 @Value("${name}")
 private String name;
}
  • 在配置⽂件中注⼊ name: xiaohei
  • @ConfigurationProperties(prefix="前缀")
@Component
@Data
@ConfigurationProperties(prefix = "user")
public class User {
 private String id;
 private String name;
 private Integer age;
 private String bir;
  
}

  • 编写配置⽂件
user:
 id: 22
 name: username
 age: 22
 bir: 2022/12/12

aop


<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starteraop</artifactId>
</dependency>
/**
 @Aspect ⽤来类上,代表这个类是⼀个切⾯
 @Before ⽤在⽅法上代表这个⽅法是⼀个前置通知⽅法
 @After ⽤在⽅法上代表这个⽅法是⼀个后置通知⽅法
 @Around ⽤在⽅法上代表这个⽅法是⼀个环绕的⽅法
 @Around ⽤在⽅法上代表这个⽅法是⼀个环绕的⽅法
**/

/** 前置通知 */
@Aspect
@Component
public class MyAspect {
 @Before("execution(* com.sovue.service.*.*
(..))")
 public void before(JoinPoint joinPoint){
 System.out.println("前置通知");
 joinPoint.getTarget();//⽬标对象
 joinPoint.getSignature();//⽅法签名
 joinPoint.getArgs();//⽅法参数
 }
}

/**   后置 通知 */
@Aspect
@Component
public class MyAspect {
 @After("execution(* com.sovue.service.*.*
(..))")
 public void before(JoinPoint joinPoint){
 System.out.println("后置通知");
 joinPoint.getTarget();//⽬标对象
 joinPoint.getSignature();//⽅法签名
 joinPoint.getArgs();//⽅法参数
 }
}
/**注意: 前置通知和后置通知都没有返回值,⽅法参数都为
joinpoint**/


/*  环绕切面 */

@Aspect
@Component
public class MyAspect {
 @Around("execution(* com.sovue.service.*.*
(..))")
 public Object before(ProceedingJoinPoint
proceedingJoinPoint) throws Throwable {
 System.out.println("进⼊环绕通知");
 proceedingJoinPoint.getTarget();//⽬标对象
 proceedingJoinPoint.getSignature();//⽅法签
名
 proceedingJoinPoint.getArgs();//⽅法参数
 Object proceed =
proceedingJoinPoint.proceed();//放⾏执⾏⽬标⽅法


 System.out.println("⽬标⽅法执⾏之后回到环绕通
知");
 return proceed;//返回⽬标⽅法返回值
 }
}

//  注意: 环绕通知存在返回值,参数为ProceedingJoinPoint,
// 如果执⾏放⾏,不会执⾏⽬标⽅法,⼀旦放⾏必须将⽬标⽅法的返回值
// 返回,否则调⽤者⽆法接受返回数据


boot 下载

@RequestMapping("/download")
public void download(String fileName,
HttpServletRequest request, HttpServletResponse
response) throws Exception {
 String realPath =
request.getRealPath("/upload");
 FileInputStream is = new
FileInputStream(new File(realPath, fileName));
 ServletOutputStream os =
response.getOutputStream();
 response.setHeader("contentdisposition","attachment;fileName="+
URLEncoder.encode(fileName,"UTF-8"));
 IOUtils.copy(is,os);
 IOUtils.closeQuietly(is);
 IOUtils.closeQuietly(os);
 }