Spring
Shen_Li_Java_ing
加电!加电!!加电!!!
展开
-
Bean的作用域
(仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。(仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。,每次获取都会创建一个新的 bean 实例。两次,得到的是不同的 Bean 实例。原创 2024-06-07 20:49:34 · 486 阅读 · 0 评论 -
Spring AOP怎么聊(通俗易懂)
在不改变原来这个方法,这个类的前提下,去增加对应的逻辑,这个背后底层的java上的原理是继承和是用接口的形式,但我们写代码的时候并没有去继承他,也没用去实现这个接口,那这部分内容是谁帮我们完成的,是spring,也就是动态代理,什么是动态:动态生成(我们没有去实现这个接口和继承,spring自动帮我们去做这个事情),根据不同的范围创建不同的类代理。动态代理,即在运行时将切面的逻辑进去,针对实现类A,然后定义要代理的切入点和切面的实现,程序会自动在运行时生成类似上面的代理类。原创 2024-05-10 22:33:06 · 467 阅读 · 0 评论 -
@Autowired和@Resource的区别
主要用于字段和方法上的注入,不支持在构造函数或参数上使用。都需要通过名称才能正确匹配到对应的 Bean。支持在构造函数、方法、字段和参数上使用。当一个接口存在多个实现类的情况下,是 Spring 提供的注解,是 JDK 提供的注解。(根据类型进行匹配),(根据名称进行匹配)。注解来显式指定名称,属性来显式指定名称。原创 2024-05-09 22:07:35 · 528 阅读 · 0 评论 -
Spring事务失效的场景
因为Spring事务的本质是动态代理,通过生成代理对象去调用方法,并且在方法前后增加事务效果;同一类中的方法调用时,无法使用代理对象调用,使用的是this调用,因此无法实现动态代理效果。:考虑动态代理的实现原理,无论是基于JDK还是CGLib,都不允许final和static的修饰。: Spring默认只会在遇到error和RunTimeException时才会回滚。:使用catch进行捕获之后,Spring无法感知到异常,无法回滚。原创 2024-05-09 22:06:37 · 714 阅读 · 0 评论 -
控制反转(IOC)和依赖注入(DI)
IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。控制:指的是对象创建(实例化、管理)的权力反转:控制权交给外部环境(Spring 框架、IoC 容器)在Spring框架中,IOC是通过依赖注入(Dependency Injection,DI)来实现的。依赖注入是IOC的一种实现方式,它通过将依赖关系注入到对象中,而不是由对象自己创建或查找依赖关系。这样做可以使得对象更加松散耦合,更易于测试和维护。原创 2024-05-08 21:45:59 · 402 阅读 · 0 评论 -
Spring Bean的线程安全问题
就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。,每次获取都会创建一个新的 bean 实例,不管对于有状态的bean和无状态的bean,都不存在线程安全问题,但如果变量是静态的,那就会有线程不安全问题。无状态的bean不会有线程安全问题,但对于有状态的bean会有线程安全问题,可以用(threadlocal,改作用域,避免定义可变的成员变量)来解决。原创 2024-05-08 20:51:57 · 599 阅读 · 0 评论 -
JDK动态代理和Cglib动态代理区别
3.JDK动态代理是通过反射的方式去实现代理对象的所有方法,通过InvocationHandler接口,重写invoke()方法来实现代理逻辑,其中会调用Proxy.newProxyInstance()来创建目标对象,而Cglib是通过继承的方式;4.JDK只会生成一个代理对象,而Cglib会生成多个,采用空间换取时间的方式,所以生成效率会比jdk代理慢,但是使用效率会比JDK动态代理快;2.JDK代理使用自己的字节码生成工具生成代理对象,而Cglib会使用ASM字节码生成工具去生成;原创 2024-05-07 21:41:35 · 370 阅读 · 0 评论 -
Spring如何解决循环依赖问题?
在A实例化完成后,开始属性赋值的时候,去缓存中找B,发现B没有完成初始化,就开始B的实例化,之后发现A并没有初始化完成,所以B要去拿到提前暴露的A的对象,之后B就可以顺利进行初始化,初始化完成后将B放入一级缓存,之后A就可以去以及缓存中拿B,A就可以顺利执行完,执行完后,A也将放入一级缓存中。首先A实例化完后,放入第三级缓存中,然后去创建B,B去一级缓存中去拿 ,一级缓存没有,去二级缓存拿,也没有如果去三级缓存中拿,那肯定不行,B要的是代理对象,所以要有个地方去存A的代理对象,代理对象放在第二级缓存中。原创 2024-05-07 21:01:14 · 640 阅读 · 0 评论