IOC 控制反转,是指将对象控制权转移到spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法。
面向切面,作为面向对象一种补充。将那些与业务无关公共行为和逻辑,抽取并封装为一个可重用的模块,减少系统的重复代码,降低模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理等。

aop环绕通知和前置通知,后置通知有着很大的区别,主要有两个重要的区别:
1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知 是不能决定的,他们只是在方法的调用前后执行通知而已,即目标方法肯定是要执行的。
2) 环绕通知可以控制返回对象,即你可以返回一个与目标对象完全不同的返回值,虽然这很危险,但是你却可以办到。而后置方法是无法办到的,因为他是在目标方法返回值后调用
1.抛出检查异常(默认只对RuntimeException 和 Error 有效)
2.try-catch
3.aop切面
4.非public方法导致事务失效
5.父子容器导致事务失效
6.调用本类方法导致传播行为失效(本类方法调用不经过代理)
7. @Transational 没有保证原子行为,select方法没有阻塞
8.@Transational 方法导致的synchronized失效,synchronized仅保证目标方法的原子性,没有环绕commit等操作
Bean的生命周期概括起来有四个阶段:实例化 -> 属性赋值 -> 初始化 -> 销毁
Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。
Spring 最核心的思想就是不重新造轮子,开箱即用,提高开发效率。
Spring 提供的核心功能主要是 IoC 和 AOP。
Spring 包含了Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring MVC的功能实现都需要依赖于该模块。
Spring MVC 是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。
Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!)。
IoC(Inverse of Control:控制反转) 是一种设计思想。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
Bean 代指的就是那些被 IoC 容器所管理的对象。
配置元数据可以是 XML 文件、注解或者 Java 配置类。
@Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。@Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。@Component 注解作用于类,而@Bean注解作用于方法。@Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean@Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。Spring 内置的 @Autowired 以及 JDK 内置的 @Resource 和 @Inject 都可以用于注入 Bean。
@Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。@Autowired 和@Resource都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 @Qualifier 注解来显示指定名称,@Resource可以通过 name 属性来显示指定名称。getBean() 两次,得到的是不同的 Bean 实例。controller默认是单例的,正因为单例所以不是线程安全的。
常见的有两种解决办法:
ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
DispatcherServlet :核心的中央处理器,负责接收请求、分发,并给予客户端响应。HandlerMapping :处理器映射器,根据 uri 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。HandlerAdapter :处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler;Handler :请求处理器,处理实际请求的处理器。ViewResolver :视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端 
注解的方式统一异常处理用到 @ControllerAdvice + @ExceptionHandler 这两个注解 。
- @ControllerAdvice
- @ResponseBody
- public class GlobalExceptionHandler {
-
- @ExceptionHandler(BaseException.class)
- public ResponseEntity> handleAppException(BaseException ex, HttpServletRequest request) {
- //......
- }
-
- @ExceptionHandler(value = ResourceNotFoundException.class)
- public ResponseEntity
handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) { - //......
- }
- }
BeanFactory、ApplicationContext 创建 bean 对象。jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。Controller。TransactionTemplate或者 TransactionManager 手动管理事务,实际应用中很少使用,但是对于你理解 Spring 事务管理原理有帮助。@Transactional 的全注解方式使用最多)Transactional 事务传播级别TransactionDefinition.PROPAGATION_REQUIRED
@Transactional注解默认使用就是这个事务传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
Spring Security 提供了多种加密算法的实现,开箱即用,非常方便。这些加密算法实现类的父类是 PasswordEncoder ,如果你想要自己实现一个加密算法的话,也需要继承 PasswordEncoder。
- public interface PasswordEncoder {
- // 加密也就是对原始密码进行编码
- String encode(CharSequence var1);
- // 比对原始密码和数据库中保存的密码
- boolean matches(CharSequence var1, String var2);
- // 判断加密密码是否需要再次进行加密,默认返回 false
- default boolean upgradeEncoding(String encodedPassword) {
- return false;
- }
- }
@RestController@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。
适合前后端分离项目
GET /users(获取所有学生)POST /users(创建学生)PUT /users/12(更新编号为 12 的学生)DELETE /users/12(删除编号为 12 的学生)@GetMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.GET)
@RequestBody读取 Request 请求的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。
- @PostMapping("/sign-up")
- public ResponseEntity signUp(@RequestBody @Valid UserRegisterRequest userRegisterRequest) {
- userService.save(userRegisterRequest);
- return ResponseEntity.ok().build();
- }
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public class UserRegisterRequest {
- @NotBlank
- private String userName;
- @NotBlank
- private String password;
- @NotBlank
- private String fullName;
- }
@Value(常用)读取配置
- @Value("${wuhan2020}")
- String wuhan2020;
出于浏览器的同源策略
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
第一种:添加@CrossOrigin注解
- @RestController
- @RequestMapping("index")
- public class IndexController {
-
- @GetMapping("/test")
- @CrossOrigin
- public String index() {
- return "hello world";
- }
- }
第二种:添加CORS过滤器
- @Configuration
- public class CorsConfig {
- // 跨域请求处理
- @Bean
- public CorsFilter corsFilter() {
- CorsConfiguration config = new CorsConfiguration();
- //允许所有域名进行跨域调用
- config.addAllowedOrigin("*");
- //允许所有请求头
- config.addAllowedHeader("*");
- //允许所有方法
- config.addAllowedMethod("*");
- UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
- source.registerCorsConfiguration("/**", config);
- return new CorsFilter(source);
- }
- }
第三种:实现WebMvcConfigurer,重写addCorsMappings方法
- @Configuration
- public class CorsConfiguration implements WebMvcConfigurer{
-
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**")
- .allowedOriginPatterns("*")
- .allowCredentials(true)
- .allowedMethods("GET", "POST", "DELETE", "PUT")
- .maxAge(3600);
- }
- }