這裡蒐索程式師資訊,查找有用的技術資料
当前位置:首页 » 硬盘大全 » spring循环依赖的缓存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

spring循环依赖的缓存

发布时间: 2022-04-21 00:29:13

‘壹’ spring循环依赖及解决方式是什么

发生在beanA依赖于另一个beanB时,beanB依赖于beanA。

当Spring上下文加载所有bean时,它会尝试按照它们完全工作所需的顺序创建bean。例如,如果我们没有循环依赖,如下例所示:

A->B->C。

Spring将创建beanC,然后创建beanB(并将bean注入其中),然后创建beanA(并将beanB注入其中)。

但是,当具有循环依赖时,Spring无法决定应该首先创建哪个bean,因为它们彼此依赖。在这些情况下,Spring将在加载上下文时引发。

使用构造函数注入时,它可能发生在Spring中;如果您使用其他类型的注入,则不应该发现此问题,因为依赖项将在需要时注入,而不是在上下文加载时注入。

简介

Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架。

Spring是一个开源容器框架,它集成各类型的工具,通过核心的Beanfactory实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。

‘贰’ spring上的缓存与页面缓存有什么作用

@Cacheable(value="accountCache"),这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数 userName,value 就是 Account 对象。“accountCache”缓存是在 spring*.xml 中定义的名称。
示例:

@Cacheable(value="accountCache")// 使用了一个缓存名叫 accountCache
public Account getAccountByName(String userName) {
// 方法内部实现不考虑缓存逻辑,直接实现业务
System.out.println("real query account."+userName);
return getFromDB(userName);

回答不容易,希望能帮到您,满意请帮忙采纳一下,谢谢 !

‘叁’ spring怎么解决循环依赖

做正常的业务的话很少出现你说的情况。楼主在设计上可能考虑不周。你可以重新修改下各类功能。具体解决办法还得根据您做的项目来解决。

‘肆’ spring为什么要用redis缓存

首先可以在多台服务器装memcached,启动时分别指定容量和端口
访问时采用集群方式访问,只需要spring配置文件里面配置即可
value可以放任何对象,包括集合
每个键值的生命周期可以在放入时独立设置
类库可以用spymemcached

数据更新方式可以在后台的定时任务中执行

下面是spring mvc中配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">
<property name="servers" value="服务器A:端口,服务器B:端口,服务器C:端口" />
<property name="protocol" value="BINARY" />
<property name="transcoder">
<bean class="net.spy.memcached.transcoders.SerializingTranscoder">
<property name="compressionThreshold" value="1024" />
</bean>
</property>
<property name="opTimeout" value="2000" />
<property name="timeoutExceptionThreshold" value="1998" />
<property name="locatorType" value="CONSISTENT" />
<property name="hashAlg">
<value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value>
</property>
<property name="failureMode" value="Redistribute" />
<property name="useNagleAlgorithm" value="false" />
</bean>

‘伍’ Spring缓存,@Cacheable注解的value属性缓存名称是个什么东西

在ehcache.xml里面配置的cache标签的name就是这个value值

‘陆’ 如何在spring中使用缓存

在Spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果;2.在某个方法执行前或后清空缓存。
Spring仅仅是提供了对缓存的支持,但它并没有任何的缓存功能的实现,spring使用的是第三方的缓存框架来实现缓存的功能。其中,spring对EHCache提供了很好的支持。
参考博客:http://www.cnblogs.com/fysola/p/6378400.html

‘柒’ spring如何解决循环依赖

首先我们要清楚什么是循环依赖

意思就是多个bean相互持有对方,比如我们有两个bean,第一个bean依赖第二个bean,第二个bean也依赖第一个bean。然后一个程序去调用第一个bean的时候,因为第一个bean含有第二个bean的依赖,然后就会去调用第二个bean;再然后第二个bean也有第一个bean的依赖,然后又去调用第一个bean,就这样一直循环调用

最后spring又是怎么去解决这样一个问题的呢?

先是实例化对象,然后赋值,初始化..........正是因为这样一个生命周期,造成了spring的循环依赖,最后就是spring采用三级缓存来解决他的循环依赖的问题

spring的三级缓存就是三个Map

它是默认关闭的,是mapper级的缓存

三级缓存:存放实例化好的bean

整个的解决循环依赖的流程:

首先到一级缓存的单列中去获取,如果有就直接返回

如果没有或者这时候正处于创建过程中,就到二级缓存中去获取,如果拿到就直接返回

如果没有拿到,那现在就到了三级缓存了,就是用getObject()从三级缓存中获取,如果获取到就把这个移除掉,放到二级缓存中去

‘捌’ spring自带缓存机制怎么弄

此缓存方法既适用于层,也适用于service层


spring配置文件配置:<!--缓存配置-->
<!--启用缓存注解功能-->
<cache:annotation-drivencache-manager="cacheManager"/>
<!--spring自己的基于java.util.concurrent.ConcurrentHashMap实现的缓存管理器(该功能是从Spring3.1开始提供)-->
<beanid="cacheManager"class="org.springframework.cache.support.SimpleCacheManager">
<propertyname="caches">
<set>
<!--此处类concurrentMapCacheFactoryBean的作用是
-->
<beanname="myCache"class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/>
</set>
</property>
</bean>service层示例如下:@Transactional(readOnly=true)
@Cacheable(value="myCache")
publicJsonObjectgetWFK(JsonObjectparams){
OneObob=newOneOb();
try{
List<Map<String,Object>>map=LawAssistantMapper.getWFK();
ob.setOb(map);
}catch(Exceptione){
e.printStackTrace();
ob.setCode(500);
ob.setMsg("服务器错误!!!");
returnnewJsonObject(Json.encode(ob));
}
ob.setCode(200);
ob.setMsg("ok");
logger.debug(Json.encode(ob));
returnnewJsonObject(Json.encode(ob));

}

由于使用的是spring自带的缓存类,所以,仅仅需要两步:1.在spring配置文件中声明,2.在service层,方法代码前增加注解,即可。


缺点:
spring自带的缓存功能,实质上是通过java类来保存缓存的数据,这样会占用一定的内存消耗,并发率越高,对内存的压力越大。
码民直接使用的缓存类:org.springframework.cache.support.SimpleCacheManager,org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean

‘玖’ Spring是怎么解决Bean之间的循环依赖的

Spring的循环依赖的理论依据其实是基于Java的引用传递,当我们获取到对象的引用时,对象的field或则属性是可以延后设置的(但是构造器必须是在获取引用之前)。
Spring的单例对象的初始化主要分为三步:

(1)createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象
(2)populateBean:填充属性,这一步主要是多bean的依赖属性进行填充
(3)initializeBean:调用spring xml中的init 方法。
从上面讲述的单例bean初始化步骤我们可以知道,循环依赖主要发生在第一、第二部。也就是构造器循环依赖和field循环依赖。
那么我们要解决循环引用也应该从初始化过程着手,对于单例来说,在Spring容器整个生命周期内,有且只有一个对象,所以很容易想到这个对象应该存在Cache中,Spring为了解决单例的循环依赖问题,使用了三级缓存。

‘拾’ spring cache redis都缓存什么数据

首先可以在多台服务器装memcached,启动时分别指定容量和端口 访问时采用集群方式访问,只需要spring配置文件里面配置即可 value可以放任何对象,包括集合 每个键值的生命周期可以在放入时独立设置 类库可以用spymemcached 数据更新方式可以在后