Spring专题

一:SpringMVC常用注解

@RequestMapping:用于映射请求路径。

@RequestBody:json数据转java对象

@ResponseBody:java对象转json

@RestController:controller+ResponseBody

@RequestParam:指定请求参数的名称(前后台参数名称不一样,或者设置参数默认值)

@Resource @Autowired区别

@Resource(name = "courseDao")
   private ICourseDao courseDao;
  1. @Resource默认是按照名称装配的,是JDK提供的。
byName 通过参数名自动装配,如果一个bean的name 和另外一个bean的 property 相同,就自动装配。

@Autowired是默认按照类型装配的 ,是Spring提供的。

byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,就自动装配。

Spring常用注解

重点说:bean的实例化、依赖注入的注解

注解

说明

@Component、@Controller、@Service、@Repository

使用在类上用于实例化Bean

@Autowired

使用在字段上用于根据类型依赖注入

@Qualifier

结合@Autowired一起使用用于根据名称进行依赖注入

@Scope

标注Bean的作用范围(默认是单利)

@Configuration

指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解

@ComponentScan

用于指定 Spring在初始化容器时要扫描的包

@Bean

使用在方法上,标注将该方法的返回值存储到Spring容器中

@Import

使用@Import导入的类会被Spring加载到IOC容器中

@Aspect、@Before、@After、@Around、@Pointcut

用于切面编程(AOP)

spring boot常用注解

注解

说明

@SpringBootApplication

SpringBoot项目启动类注解

@SpringBootConfiguration

@Configuration注解,实现配置文件的功能。主配置类

@EnableAutoConfiguration

打开自动配置的功能,也可以关闭某个自动配置的选

@ComponentScan

Spring组件扫描

SpringMVC运行流程

什么是IOC和DI

控制反转(Inversion on Control)IOC:对象的创建交给外部容器来完成(这里就是交给Spring容器),这就叫控制反转。

IOC:Spring就是一个大的内存容器(一块内存区域),三层架构里面上一层不需要再去new下一层对象,在上一层只需要写下一层的接口,new对象由Spring容器帮我们完成,各层直接向Spring容器要对象就可以。

依赖注入:Dependency injection (DI)

现在new这个对象不是由自己new,是由Spring容器帮我们new对象,现在要得到这个Spring容器new出来的对象,就要“依赖”Spring容器,“注入”Spring容器new出来的对象

什么是AOP

AOP:Aspect Oriented Programming 面向切面编程

功能:让关注点代码(事物、权限、日志要增强的功能)和业务代码分离。

不改变目标对象的行为,还能给目标对象增强功能。

AOP通知类型

SpringAOP的使用场景:操作日志、记录Service执行时间

静态代理

为目标对象提供一种代理以控制对这个对象的访问。

静态代理优缺点:
优点:
可以做到不修改目标对象的前提下,对目标对象的功能进行扩展
(目标对象董事长只要关注签字,像开启事物和关闭事物的操作都交给秘书处理)
缺点:
  1. 代理对象和目标对象实现相同的接口,有一个目标对象就要有一个代理对象,会产生很多代理类,类太多。
  2. 一旦接口增加方法,目标对象和代理对象都要去维护。

什么是动态代理,使用场景

不需要自己写代理类,但是目标对象还是需要实现接口;

代理对象的生成,是利用JDK API, 动态的在内存中构建代理对象

动态代理也叫:JDK代理,接口代理;

设计模式

是对以有问题固定的解决方法的总结

单例模式

单例模式是一种常见的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在。

    应用场景:日志系统、数据库连接池、缓存系统、配置文件管理器等都需要确保一个实例化对象,保证资源高效利用和稳定。

   ​​​​​饿汉式:还没有使用就实例化了,从线程安全上看:安全的。

   

懒汉式:也就是在用到的时候才去实例化

从线程安全上看:不安全的(所以要加锁synchronized)

懒汉式优化:双重检查机制

如果实例存在就没有必要走同步的必要,如果实例不存在才会进入同步块。

这样只会在第一次创建的时候同步一次,其余的时候不需要同步。

第二重检查是因为:当A线程执行 new Singleton()时候,B线程正在执行第一重检查if(instance == null)此时B线程会进入,所以在synchronized中要再做一次检查。

Spring注入Bean的方式

bean就是生成一个实例对象意思

 
 

每次容器启动的时候会创建容器(applicationContext.xml)中配置的所有的bean对象,并不是从容器中拿出这个bean的时候才去实例化

1:set方法注入

2:构造方法

3:注解方式

@Controller @Service @Repository 本身没有区别,都是new一个对象放到Spring容器中

@Component new一个对象放到Spring容器中,不起名字,放到容器中默认的名字是类名首个单词首字母小写

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";

}

@Controller、@Service、@Repository这三个注解的作用和@Component是一样的,都是new一个对象放到Spring容器中,目的是为了表明三层架构中不同的层。

Spring bean生命周期、Spring创建bean的流程

Spring如何解决循环依赖问题

@SpringBoot 自动配置AutoConfiguration流程

IOC:

由@ComponentScan注解先保证主配置里面@Component、@Controller、@Service、@Repository、@Configuration先加载完,再加载从属配置(自动配置)的配置信息(第三方jar)@EnableAutoConfiguration

过滤器与拦截器区别,过滤器和拦截器分别怎么实现

过滤器 和 拦截器 均体现了AOP的编程思想,都可以实现诸如日志记录、登录鉴权等功能,但二者的不同点也是比较多的

  1. 实现原理不同

过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。

  1. 使用范围不同

过滤器 实现的是 javax.servlet.Filter 接口,这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。

拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,还可以使用在其他地方

  1. 触发时机不同

过滤器 和 拦截器的触发时机也不同,我们看下边这张图。

执行顺序 :过滤前 - 拦截前 - Controller处理 - 拦截后 - 过滤后

$和#区别,$的应用场景

动态sql标签 where set trim

resultType和resultMap的区别? 使用场景

association、collection

Mybatis懒加载

MyBatis一级缓存、二级缓存

微服务SpringCloud:Nacos、OpenFeign、Gatway路由、负载均衡、集群、分布式

SpringBoot和SpringCloud关系 SpringBoot可以单独开发项目,SpringCloud微服务搭建依赖SpringBoot

你可能感兴趣的:(spring,java,后端)