Spring
文章平均质量分 76
Spring
shangjg3
这个作者很懒,什么都没留下…
展开
-
spring是如何解决循环依赖的,为什么不是两级
通过这种方式,Spring可以确保在需要时提供正确的对象实例,无论是原始对象还是其代理对象,从而解决了循环依赖的问题。:在某些情况下,二级缓存用于存储Bean的代理对象或原始实例,以避免重复创建。然而,在处理循环依赖时,二级缓存不足以解决问题,因为它不能确保在需要时总是提供正确的对象实例。当其他Bean依赖这个Bean时,可以直接从缓存中获取实例,避免重复创建。通过上面的图,仔细分析一下,其实把二级缓存拿掉,在 B 尝试获取 A 的时候直接返回 A 的实例,是不是也是可以的?原创 2024-07-18 17:11:10 · 1907 阅读 · 0 评论 -
Spring的启动过程
在实例化 Bean 的过程中,Spring 容器会解析 Bean 之间的依赖关系,并将依赖的 Bean 注入到需要它们的 Bean 中。如果应用程序中使用了 AOP(面向切面编程),Spring 将会应用切面逻辑,为 Bean 动态生成代理,并将切面逻辑织入到相应的 Bean 中。Spring 容器会根据配置文件中的定义,实例化所有的 Bean。一旦所有的 Bean 实例化、依赖注入和初始化工作完成,Spring 容器就会完成启动过程,应用程序就可以开始处理请求和响应了。4)实例化 Bean。原创 2024-07-16 04:15:00 · 333 阅读 · 0 评论 -
Spring 如何解决循环依赖问题
在创建Bean的过程中,Spring会使用三级缓存来管理对象的创建过程,保证在创建过程中依然能够提供已经初始化完成的对象引用,从而解决循环依赖的问题。Spring 解决循环依赖问题的核心在于提前暴露一个已经创建完成的对象引用,而不是提前暴露一个未初始化的代理对象。当请求Bean时,如果Bean正在创建中,则先返回一个临时的代理对象(早期代理对象),这样可以允许其他Bean引用该Bean,形成一个引用链。单例对象的创建过程中遇到循环依赖,Spring 采取提前暴露引用的方式解决。原创 2024-07-16 03:00:00 · 194 阅读 · 0 评论 -
使用 AspectJ实现AOP 切面
上面的代码中我们就是在@Before()中直接指定使用当前类定义的beforeAdd()方法对应的Pointcut的表达式,如果我们需要指定的Pointcut定义不是在当前类中的,我们需要加上类名称,如下面这个示例中引用的就是定义在MyService中的add()方法上的Pointcut的表达式。标准的Aspectj Aop的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的9种,外加Spring Aop自己扩充的一种一共是10种类型的表达式,分别如下。原创 2024-07-15 16:48:39 · 441 阅读 · 0 评论 -
使用Spring代理工厂实现AOP 切面
这里有个值得注意的问题:从容器中获得proxy对象时应该是org.springframework.aop.framework.ProxyFactoryBean类型的对象(如下代码所示),但这里直接就转换成IMath类型了,这是因为:ProxyFactoryBean本质上是一个用来生产Proxy的FactoryBean。如果容器中的某个对象持有某个FactoryBean的引用它取得的不是FactoryBean本身而是 FactoryBean的getObject()方法所返回的对象。即,它是类中的一个方法。原创 2024-07-15 16:45:14 · 394 阅读 · 0 评论 -
静态代理、JDK与CGLIB动态代理
参数:Object为由CGLib动态生成的代理类实例,Method为上文中实体类所调用的被代理的方法引用,Object[]为参数值列表,MethodProxy为生成的代理类对方法的代理引用。4.2、使用cglib完成动态代理,大概的原理是:cglib继承被代理的类,重写方法,织入通知,动态生成字节码并运行,因为是继承所以final类是没有办法动态代理的。5.4、如果项目中有多个类,则需要编写多个代理类,工作量大,不好修改,不好维护,不能应对变化。被代理的类必须实现接口,未实现接口则没办法完成动态代理。原创 2024-07-13 03:00:00 · 840 阅读 · 0 评论 -
Spring AOP 实现原理
说明:当容器收集BeanPostProcessor类型的Bean对象时,会自动解析该BeanDefinition、实例化对象、属性设置并注入到IOC容器中,该部分逻辑可以参考Spring系列-2 Bean的生命周期,区别在于AnnotationAwareAspectJAutoProxyCreator的注入流程发生在Spring容器收集BeanPostProcessor类型的Bean对象时,而不是加载所有的非懒加载单例Bean。[2] exposeProxy表示是否暴露代理对象,默认值为false;原创 2024-07-12 03:45:00 · 822 阅读 · 0 评论 -
Spring AOP 使用方式
另外,@AfterThrowing还可添加异常类型的参数,而@AfterReturing可以添加一个Object类型的参数(表示运行结果),以下通过案例的形式进行介绍。其中:advisor将所有的逻辑都封装在了MethodInterceptor的invoke方法中,通过方法完成增强;@Before表示前置增强,@AfterReturing表示后置增强,@Around表示环绕增强,@AfterThrowing表示异常抛出增强,@After表示方法正常执行完或者异常抛出都会执行的增强逻辑;原创 2024-07-12 03:00:00 · 353 阅读 · 0 评论 -
Spring AOP 基础知识
AOP的技术整合(织入增强逻辑)可以发生在编译器、类加载期以及运行期:AspectJ在编译器(ajc)和类加载器(使用特定的类加载器)实现;抽取重复代码作为一个模块是用户的问题,然而技术整合(对目标织入增强逻辑,后文介绍)以实现功能还原是AOP的目标和工作重心,Spring AOP是该技术的一种实现。, 即表示不进行增强。框架定义切点是为了从目标类的连接点(执行点)中过滤出符合条件的部分,为此在切点类的内部提供类两个过滤器:ClassFilter和MethodMatcher,分别对类型和方法进行过滤。原创 2024-07-11 11:50:26 · 636 阅读 · 0 评论 -
Spring 事务失效的 8 种场景
submitOrder()方法和updateProductStockCountById()方法都在OrderService类中,submitOrder()方法上没有标注事务注解,updateProductStockCountById()方法上标注了事务注解,submitOrder()方法调用了updateProductStockCountById()方法,此时,updateProductStockCountById()方法的事务在Spring中会失效。例如,如下代码所示。原创 2024-06-28 17:31:43 · 582 阅读 · 0 评论 -
Spring基础知识 - IOC、DI、AOP
4、容器:Spring 框架提供了一个容器,用于管理应用程序的对象和依赖关系,并提供了一些可重用的核心组件,如 BeanFactory、ApplicationContext 等,这些对象可以是 Spring Bean、JDBC 连接、JMS 连接、Servlet 等。从而导致类与类之间的耦合度过高。AOP(Aspect Oriented Programming,面向切面编程)是 Spring 框架提供的一种重要机制,它可以将应用程序中的横切关注点(如日志、事务、安全等)从业务逻辑中分离出来,并集中管理。原创 2024-06-29 03:30:00 · 1497 阅读 · 0 评论 -
Spring 基础知识
总的来说,过滤器是在 Servlet 容器层面上对请求进行处理的,而拦截器是在 Spring MVC 框架层面上对请求进行处理的,过滤器更加底层,可以对请求进行一些底层的处理,而拦截器更加高级,可以对请求进行一些业务逻辑层面的处理。这种方式可以将对象的创建和管理解耦,并且可以灵活地配置和管理对象。@Autowired是Spring提供的注解,而@Resource是JSR-250规范中定义的注解,因此@Autowired是Spring特有的注解,而@Resource是JavaEE的注解,它们的使用范围不同。原创 2024-06-29 03:00:00 · 441 阅读 · 0 评论 -
AOP的实现原理
它可以实现不用写代理类的实现就可以创建代理类对象;通过代理类对象执行目标接口中的方法,会把方法的调用分派给调用处理器(InvocationHandler)的实现类,执行实现类中的invoke()方法,我们需要把在该invoke()方法中实现调用目标类的目标方法;2.代理角色(连接真实角色的桥梁):实现抽象角色,是真实角色的代理,通过真实角色的角色业务逻辑方法,来实现抽象方法,附加自己的操作。3.真实角色(需要被代理的对象):实现抽象角色,定义真实的角色所要实现的业务逻辑,提供代理角色调用。原创 2024-06-28 17:16:12 · 730 阅读 · 0 评论