- 浏览: 92059 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
dylan0514sina.cn:
youjianbo_han_87 写道dylan0514sin ...
方法缓存 -
youjianbo_han_87:
dylan0514sina.cn 写道youjianbo_ha ...
方法缓存 -
dylan0514sina.cn:
youjianbo_han_87 写道缓存方法有意义吗,方法+ ...
方法缓存 -
youjianbo_han_87:
缓存方法有意义吗,方法+调用从缓存中取内容的方法 换成 方法+ ...
方法缓存 -
dylan0514sina.cn:
Shen.Yiyang 写道剔除策略只有方法执行的时候指定ke ...
方法缓存
介绍
spring3.1之后提供了方法的缓存支持,透明的将缓存添加到应用中。这种缓存架构类似事务架构,提供了不同的缓存方案。
理解缓存架构
缓存架构的核心在于缓存Java方法,减少方法执行次数。就是说当目标方法执行时,架构会检查指定参数的方便是否已经被执行过,如果没有则执行,并缓存结果返回;否则直接返回缓存结果并不执行方法。当然这种情况只针对方法执行结果结果不会变。
缓存和缓冲区
缓冲区用于在读写操作之间开放的临时存储区,操作快的一方必须等待慢的一方因此影响性能。缓存区通过开放大的比较合适的数据块而不是单字节,以缓解这种性能损失,特征是单条记录读写只有一次,而且至少有一方知道这个缓存区
缓存是隐藏的当缓存行为发生时都不知道缓存的存在,允许同一份数据被读多次来提高性能
利用缓存架构主要关注两个方面
声明缓存-标志要缓存的方法及策略
缓存配置-后端缓存 数据读和写的地方
我们只需要关注缓存逻辑行为而不是真正读写的地方。spring提供了两种开箱即用的缓存配置实现--JDK java.util.concurrent.ConcurrentMap和 EhCache,当然也支持其他插拔式的缓存提供者。
基于注解的声明式缓存
架构提供了两种注解 @Cacheable 和 @CacheEvict,允许方法触发缓存存储和缓存剔除,接下来了解每种注解
@Cacheable
用于声明需要缓存的方法。方法的结果被存储到缓存当下次相同参数的方法调用时返回缓存的结果,而不需要调用目标方法,注解指定了方法的缓存名字:
在上面的片段中,books是和方法findBook关联的缓存名。每次方法调用时会检查这个缓存,看是否方法已经执行过而不必重新执行。在大多数情况下仅有一个缓存,但是也支持多个名指定多个缓存,这种情况下方法执行之前会依次检查这些缓存,如果命中则返回关联的结果。不管方法有没有执行,这几个缓存的数据将保持一致。
默认键值生成策略
缓存本质上由键值对实现,有必要为缓存的方法设计一个合理的键值以便访问缓存,架构提供了一个简单的KeyGenerator实现:
一般情况下,只要hashcode()方法能反应键值就行。在分布式环境下如果参数实现remote接口,规定hashcode的实现中指定的是同一台服务器地址,而不同服务器上的相同方法hashcode必然不一样因此要作调整。不管在哪种环境,对这种算法来讲hashcode不可丢失。而且在同一jvm中,相同的hashcode能被不同的对象复用。
可以通过实现org.springframework.cache.KeyGenerator接口,提供不同的算法实现,配置如下
一旦配置好,将被没指定key的方法使用。
指定key
尽管缓存是通用的,但目标方法签名可能是各式各样的,不能简单的映射为缓存键值。就是当方法有多个参数时,我们要选择合适的参数作为键值(部分)
咋一看,虽然两个boolean参数影响数找到的结果,但对缓存来说没什么用,也有可能只有一个有用?
@Cacheable允许指定key是如何生成的,架构使用Spring表达式语言选择感兴趣的参数并进行计算,不需要实现其他接口。这是一种推荐的配置以覆盖默认的键值生成策略。
以下是 SpEL声明的例子
以上片段中,指定,方法参数,参数属性,和任意静态方法。
缓存条件
有时候方法可能不适合总是缓存,例如依赖方法参数。架构提供了这样的功能,通过conditional 属性SpEL计算值,如果返回true,则方法被缓存,否则不缓存。下面的方法在参数name长度小于15时才缓存
除了conditional,unless用于在方法执行完成之后根据条件是否设置结果到缓存中:
以上片段中,值缓存硬抄本而不是软抄本。
缓存SpEL的上下文
SpEL表达式计算需要专门的上下文,下面的表格中变量可以在key,conditional,unless中使用
@CachePut
不干扰方法执行,只缓存方法结果。与@Cacheable有相同属性,显然不是用来做方法优化的
当和@Cacheable一起使用时,后者使用@Cacheable而阻止方法执行,前者强迫方法执行以更新缓存。这种情况会导致混乱的结果,除非在这两者的使用条件上相反,即任何时候值有一个是可用的。
@CacheEvict
用于剔除缓存中的数据,与@Cacheable作用相反。提供了一个allEntries属性,当allEntries=true时将清除指定名称缓存中的所有数据,此时架构将忽略key值。
beforeInvocation 用于指定剔除行为是方法执行之前还是之后,beforeInvocation =false和其他注解有相同的语义,在方法执行之后进行动作。如果方法因为缓存没有执行或执行抛出异常,则不会进行剔除动作;beforeInvocation =true指定在方法执行之前执行剔除动作,当不必考虑方法执行结果时非常有效。
可以对返回void方法进行@CacheEvict,而@Cacheable和@CachePut必须有返回值,即使为null
@Caching
当要使用同一种注解比如@CacheEvict 或 @CachePut,因为对不同的缓存区可能执行条件不一,@Caching 允许在一个方法上使用多个@Cacheable, @CachePut 和@CacheEvict:
激活缓存注解
声明完方法注解之后,需要激活注解也就是在方法调用时使用注解行为,使用
@EnableCaching:
基于xml激活方式,只会在同一applicationContext中查找,不会找到父applicationContext:
激活属性设置
代理注意事项
当使用代理时@Cache*注解只适用于public方法,在proctected,package,private方法上使用时不会报错也不会有任何行为,可以使用AspectJ。
当在接口上使用@Cache*时,对proxy-target-class="true"即cglib代理或AspectJ是不可见的,是被忽略的。应在类上使用注解。
在代理模式下,只有通过代理的方法才会被拦截使用注解;相反如果在一个方法内调用本对象的另一方法,则该方法“this”不是代理对象,则不被拦截。使用AspectJ mode。
自定义缓存注解
缓存架构支持自定义注解,当要使用特定于业务的特定配置时,需要自定义注解@Cacheable和@CacheEvict对缓存结构来讲都是原生注解,可以利用它们构建。
基于xml声明注解
对于注解厌恶者来说,使用xml是个不错的选择
我们使用过spring事务配置,缓存配置使用同样的方式
配置CacheManager
spring内置了JDK ConcurrentMap 和ehcache库两种实现
基于JDK ConcurrentMap实现
以上片段创建了两个缓存区default和books,就是@cache*中的名字。只适合于一般使用:测试、简单应用。不提供持久化和剔除策略。
基于ehcache实现
基于GemFire实现
GemFire 是面向内存的以磁盘为后端的有弹性、可扩展性的缓存,是spring团队开发的。
处理无后端存储的缓存
有时转换环境或做测试时,可能有些@Cache*没指定名字或指定的不存在。一般来说会报错,这种情况下,比起移除注解,更加优雅的方式就是指定一个假的缓存,什么也不做--就是说强制方法每次都执行
内嵌第三方缓存
有很多缓存产品被用来做后端存储器,为了使用它们我们必须自己实现cacheManager和cache因为每种产品没有同一的标准,spring提供了AbstractCacheManager模版可供实现。
缓存方法的前提是主要是目标方法调用结果不变且比较耗资源比如走网络查询数据字典,或走IO加载服务器下的文件时;与多加个调度器比,孰轻孰重?
你说的这些消耗资源的操作,spring是不是也要在内存里面先缓存起来?而我用缓存,本来就是为了缓存这些耗资源和IO的东东啊。
在其他的地方加缓存没什么不可以的,只是spring提供了缓存数据在方法调用这个时机作了统一管理。这与我们也可以自定义缓存 不冲突
缓存方法的前提是主要是目标方法调用结果不变且比较耗资源比如走网络查询数据字典,或走IO加载服务器下的文件时;与多加个调度器比,孰轻孰重?
你说的这些消耗资源的操作,spring是不是也要在内存里面先缓存起来?而我用缓存,本来就是为了缓存这些耗资源和IO的东东啊。
缓存方法的前提是主要是目标方法调用结果不变且比较耗资源比如走网络查询数据字典,或走IO加载服务器下的文件时;与多加个调度器比,孰轻孰重?
没有
spring3.1之后提供了方法的缓存支持,透明的将缓存添加到应用中。这种缓存架构类似事务架构,提供了不同的缓存方案。
理解缓存架构
缓存架构的核心在于缓存Java方法,减少方法执行次数。就是说当目标方法执行时,架构会检查指定参数的方便是否已经被执行过,如果没有则执行,并缓存结果返回;否则直接返回缓存结果并不执行方法。当然这种情况只针对方法执行结果结果不会变。
缓存和缓冲区
缓冲区用于在读写操作之间开放的临时存储区,操作快的一方必须等待慢的一方因此影响性能。缓存区通过开放大的比较合适的数据块而不是单字节,以缓解这种性能损失,特征是单条记录读写只有一次,而且至少有一方知道这个缓存区
缓存是隐藏的当缓存行为发生时都不知道缓存的存在,允许同一份数据被读多次来提高性能
利用缓存架构主要关注两个方面
声明缓存-标志要缓存的方法及策略
缓存配置-后端缓存 数据读和写的地方
我们只需要关注缓存逻辑行为而不是真正读写的地方。spring提供了两种开箱即用的缓存配置实现--JDK java.util.concurrent.ConcurrentMap和 EhCache,当然也支持其他插拔式的缓存提供者。
基于注解的声明式缓存
架构提供了两种注解 @Cacheable 和 @CacheEvict,允许方法触发缓存存储和缓存剔除,接下来了解每种注解
@Cacheable
用于声明需要缓存的方法。方法的结果被存储到缓存当下次相同参数的方法调用时返回缓存的结果,而不需要调用目标方法,注解指定了方法的缓存名字:
@Cacheable("books") public Book findBook(ISBN isbn) {...}
在上面的片段中,books是和方法findBook关联的缓存名。每次方法调用时会检查这个缓存,看是否方法已经执行过而不必重新执行。在大多数情况下仅有一个缓存,但是也支持多个名指定多个缓存,这种情况下方法执行之前会依次检查这些缓存,如果命中则返回关联的结果。不管方法有没有执行,这几个缓存的数据将保持一致。
@Cacheable({ "books", "isbns" }) public Book findBook(ISBN isbn) {...}
默认键值生成策略
缓存本质上由键值对实现,有必要为缓存的方法设计一个合理的键值以便访问缓存,架构提供了一个简单的KeyGenerator实现:
- null值返回常数53
- 没有参数,则返回0;
- 只有一个参数,则返回参数本身
- 多个参数,则计算所有参数的hash值并返回
一般情况下,只要hashcode()方法能反应键值就行。在分布式环境下如果参数实现remote接口,规定hashcode的实现中指定的是同一台服务器地址,而不同服务器上的相同方法hashcode必然不一样因此要作调整。不管在哪种环境,对这种算法来讲hashcode不可丢失。而且在同一jvm中,相同的hashcode能被不同的对象复用。
可以通过实现org.springframework.cache.KeyGenerator接口,提供不同的算法实现,配置如下
<cache:annotation-driven key-generator="customGenerator"/>
一旦配置好,将被没指定key的方法使用。
指定key
尽管缓存是通用的,但目标方法签名可能是各式各样的,不能简单的映射为缓存键值。就是当方法有多个参数时,我们要选择合适的参数作为键值(部分)
@Cacheable("books") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed
咋一看,虽然两个boolean参数影响数找到的结果,但对缓存来说没什么用,也有可能只有一个有用?
@Cacheable允许指定key是如何生成的,架构使用Spring表达式语言选择感兴趣的参数并进行计算,不需要实现其他接口。这是一种推荐的配置以覆盖默认的键值生成策略。
以下是 SpEL声明的例子
Cacheable(value="books", key="#isbn" public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) @Cacheable(value="books", key="#isbn.rawNumber") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) @Cacheable(value="books", key="T(someType).hash(#isbn)") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
以上片段中,指定,方法参数,参数属性,和任意静态方法。
缓存条件
有时候方法可能不适合总是缓存,例如依赖方法参数。架构提供了这样的功能,通过conditional 属性SpEL计算值,如果返回true,则方法被缓存,否则不缓存。下面的方法在参数name长度小于15时才缓存
@Cacheable(value="book", condition="#name.length < 32") public Book findBook(String name)
除了conditional,unless用于在方法执行完成之后根据条件是否设置结果到缓存中:
@Cacheable(value="book", condition="#name.length < 32", unless="#result.hardback") public Book findBook(String name)
以上片段中,值缓存硬抄本而不是软抄本。
缓存SpEL的上下文
SpEL表达式计算需要专门的上下文,下面的表格中变量可以在key,conditional,unless中使用
name | Location | Description | Example | |
methodName | root object | The name of the method being invoked | #root.methodName | |
method | root object | The method being invoked | #root.method.name | |
target | root object | The target object being invoked | #root.target | |
targetClass | root object | The class of the target being invoked | #root.targetClass | |
args | root object | The arguments (as array) used for invoking the target | #root.args[0] | |
caches | root object | Collection of caches against which the current method is executed | #root.caches[0].name | |
argument name | evaluation context | Name of any of the method argument. If for some reason the names are not available (ex: no debug information), the argument names are also available under the a<#arg> where #arg stands for the argument index (starting from 0). | iban or a0 (one can also use p0 or p<#arg> notation as an alias). | |
result | evaluation context | The result of the method call (the value to be cached). Only available in 'unless' expressions and 'cache evict' expression (when beforeInvocation is false). | #result |
@CachePut
不干扰方法执行,只缓存方法结果。与@Cacheable有相同属性,显然不是用来做方法优化的
当和@Cacheable一起使用时,后者使用@Cacheable而阻止方法执行,前者强迫方法执行以更新缓存。这种情况会导致混乱的结果,除非在这两者的使用条件上相反,即任何时候值有一个是可用的。
@CacheEvict
用于剔除缓存中的数据,与@Cacheable作用相反。提供了一个allEntries属性,当allEntries=true时将清除指定名称缓存中的所有数据,此时架构将忽略key值。
beforeInvocation 用于指定剔除行为是方法执行之前还是之后,beforeInvocation =false和其他注解有相同的语义,在方法执行之后进行动作。如果方法因为缓存没有执行或执行抛出异常,则不会进行剔除动作;beforeInvocation =true指定在方法执行之前执行剔除动作,当不必考虑方法执行结果时非常有效。
可以对返回void方法进行@CacheEvict,而@Cacheable和@CachePut必须有返回值,即使为null
@Caching
当要使用同一种注解比如@CacheEvict 或 @CachePut,因为对不同的缓存区可能执行条件不一,@Caching 允许在一个方法上使用多个@Cacheable, @CachePut 和@CacheEvict:
@Caching(evict = { @CacheEvict("primary"), @CacheEvict(value = "secondary", key = "#p0") }) public Book importBooks(String deposit, Date date)
激活缓存注解
声明完方法注解之后,需要激活注解也就是在方法调用时使用注解行为,使用
@EnableCaching:
@Configuration @EnableCaching public class AppConfig { }
基于xml激活方式,只会在同一applicationContext中查找,不会找到父applicationContext:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <cache:annotation-driven /> </beans>
激活属性设置
cache-manager | CachingConfigurer | cacheManager | Name of cache manager to use. Only required if the name of the cache manager is not cacheManager, as in the example above. | |
mode | mode | proxy | The default mode "proxy" processes annotated beans to be proxied using Spring's AOP framework (following proxy semantics, as discussed above, applying to method calls coming in through the proxy only). The alternative mode "aspectj" instead weaves the affected classes with Spring's AspectJ caching aspect, modifying the target class byte code to apply to any kind of method call. AspectJ weaving requires spring-aspects.jar in the classpath as well as load-time weaving (or compile-time weaving) enabled. | |
proxy-target-class | proxyTargetClass | false | Applies to proxy mode only. Controls what type of caching proxies are created for classes annotated with the @Cacheable or @CacheEvict annotations. If the proxy-target-class attribute is set to true, then class-based proxies are created. If proxy-target-class is false or if the attribute is omitted, then standard JDK interface-based proxies are created. | |
order | order | Ordered.LOWEST_PRECEDENCE | Defines the order of the cache advice that is applied to beans annotated with @Cacheable or @CacheEvict. (For more information about the rules related to ordering of AOP advice, see the section called “Advice ordering”.) No specified ordering means that the AOP subsystem determines the order of the advice. |
代理注意事项
当使用代理时@Cache*注解只适用于public方法,在proctected,package,private方法上使用时不会报错也不会有任何行为,可以使用AspectJ。
当在接口上使用@Cache*时,对proxy-target-class="true"即cglib代理或AspectJ是不可见的,是被忽略的。应在类上使用注解。
在代理模式下,只有通过代理的方法才会被拦截使用注解;相反如果在一个方法内调用本对象的另一方法,则该方法“this”不是代理对象,则不被拦截。使用AspectJ mode。
自定义缓存注解
缓存架构支持自定义注解,当要使用特定于业务的特定配置时,需要自定义注解@Cacheable和@CacheEvict对缓存结构来讲都是原生注解,可以利用它们构建。
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Cacheable(value=“books”, key="#isbn") public @interface SlowService { }
@Cacheable(value="books", key="#isbn") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
@SlowService public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
基于xml声明注解
对于注解厌恶者来说,使用xml是个不错的选择
<cache:advice id="cacheAdviceInterface" cache-manager="cacheManager"> <cache:definitions cache="default"> <cache:cacheable method="cache"/> <cache:cacheable method="conditional" condition="#classField == 3"/> <cache:cacheable method="key" key="#p0"/> <cache:cacheable method="nam*" key="#root.methodName"/> <cache:cacheable method="rootVars" key="#root.methodName + #root.method.name + #root.targetClass + #root.target"/> <cache:cacheable method="nullValue" cache="default"/> </cache:definitions> <cache:definitions> <cache:cache-evict method="invalidate" cache="default"/> <cache:cache-evict method="evict" key="#p0" cache="default"/> </cache:definitions> <cache:caching cache="" condition="" key="" method=""> <cache:cache-evict /> <cache:cacheable /> <cache:cache-put /> </cache:caching> </cache:advice>
我们使用过spring事务配置,缓存配置使用同样的方式
<!-- the service we want to make cacheable --> <bean id="bookService" class="x.y.service.DefaultBookService"/> <!-- cache definitions --> <cache:advice id="cacheAdvice" cache-manager="cacheManager"> <cache:caching cache="books"> <cache:cacheable method="findBook" key="#isbn"/> <cache:cache-evict method="loadBooks" all-entries="true"/> </cache:caching> </cache:advice> <!-- apply the cacheable behavior to all BookService interfaces --> <aop:config> <aop:advisor advice-ref="cacheAdvice" pointcut="execution(* x.y.BookService.*(..))"/> </aop:config> ... // cache manager definition omitted
配置CacheManager
spring内置了JDK ConcurrentMap 和ehcache库两种实现
基于JDK ConcurrentMap实现
<!-- generic cache manager --> <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="default"/> <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="books"/> </set> </property> </bean>
以上片段创建了两个缓存区default和books,就是@cache*中的名字。只适合于一般使用:测试、简单应用。不提供持久化和剔除策略。
基于ehcache实现
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/> <!-- EhCache library setup --> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache.xml"/>
基于GemFire实现
GemFire 是面向内存的以磁盘为后端的有弹性、可扩展性的缓存,是spring团队开发的。
处理无后端存储的缓存
有时转换环境或做测试时,可能有些@Cache*没指定名字或指定的不存在。一般来说会报错,这种情况下,比起移除注解,更加优雅的方式就是指定一个假的缓存,什么也不做--就是说强制方法每次都执行
<bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager"> <property name="cacheManagers"><list> <ref bean="jdkCache"/> <ref bean="gemfireCache"/> </list></property> <property name="fallbackToNoOpCache" value="true"/> </bean>
内嵌第三方缓存
有很多缓存产品被用来做后端存储器,为了使用它们我们必须自己实现cacheManager和cache因为每种产品没有同一的标准,spring提供了AbstractCacheManager模版可供实现。
评论
6 楼
dylan0514sina.cn
2013-07-12
youjianbo_han_87 写道
dylan0514sina.cn 写道
youjianbo_han_87 写道
缓存方法有意义吗,方法+调用从缓存中取内容的方法 换成 方法+从缓存中直接取内容。换汤不换药啊。
缓存方法的前提是主要是目标方法调用结果不变且比较耗资源比如走网络查询数据字典,或走IO加载服务器下的文件时;与多加个调度器比,孰轻孰重?
你说的这些消耗资源的操作,spring是不是也要在内存里面先缓存起来?而我用缓存,本来就是为了缓存这些耗资源和IO的东东啊。
在其他的地方加缓存没什么不可以的,只是spring提供了缓存数据在方法调用这个时机作了统一管理。这与我们也可以自定义缓存 不冲突
5 楼
youjianbo_han_87
2013-07-12
dylan0514sina.cn 写道
youjianbo_han_87 写道
缓存方法有意义吗,方法+调用从缓存中取内容的方法 换成 方法+从缓存中直接取内容。换汤不换药啊。
缓存方法的前提是主要是目标方法调用结果不变且比较耗资源比如走网络查询数据字典,或走IO加载服务器下的文件时;与多加个调度器比,孰轻孰重?
你说的这些消耗资源的操作,spring是不是也要在内存里面先缓存起来?而我用缓存,本来就是为了缓存这些耗资源和IO的东东啊。
4 楼
dylan0514sina.cn
2013-07-11
youjianbo_han_87 写道
缓存方法有意义吗,方法+调用从缓存中取内容的方法 换成 方法+从缓存中直接取内容。换汤不换药啊。
缓存方法的前提是主要是目标方法调用结果不变且比较耗资源比如走网络查询数据字典,或走IO加载服务器下的文件时;与多加个调度器比,孰轻孰重?
3 楼
youjianbo_han_87
2013-07-11
缓存方法有意义吗,方法+调用从缓存中取内容的方法 换成 方法+从缓存中直接取内容。换汤不换药啊。
2 楼
dylan0514sina.cn
2013-07-11
Shen.Yiyang 写道
剔除策略只有方法执行的时候指定key或者所有entity吗? 有自定义的剔除接口吗?
没有
1 楼
Shen.Yiyang
2013-07-11
剔除策略只有方法执行的时候指定key或者所有entity吗? 有自定义的剔除接口吗?
发表评论
-
支持占位符的文本解析PropertySourcesPropertyResolver
2013-07-14 18:27 2936PropertyResolver 是 Environment的 ... -
支持不同运行环境下的属性处理--Environment 特性
2013-07-14 01:47 4080介绍 Environment架构是spring 3.1版本引 ... -
支持开发、测试、生产环境下bean配置切换的profiles特性
2013-07-11 12:31 5532介绍 Bean definition profiles ... -
基于xml schema的扩展标签
2013-07-09 13:34 1537xml schema是spring 2.0版本之后引入的,在之 ... -
BeanDefinition数据流
2013-07-08 19:41 1801BeanDefinition是Spring配置文件中bean定 ... -
bean的创建周期回调
2013-06-29 16:24 1521初始化回调 实现org.springframework ... -
Scope实现原理
2013-06-27 18:02 3300内置Scope分类 Singleton 每个IOC容器对一个b ... -
MethodInjection 动态方法替换原理
2013-06-21 14:45 1393singleton实例依赖于prototy ... -
AbstractBeanFactory获取bean周期
2013-05-11 22:58 893AbstractBeanFactory是IOC容器实现的骨 ...
相关推荐
JetCache是一个基于java的缓存系统封装,提供统一的API和注解简化...通过注解实现声明式的方法缓存 通过注解创建并配置Cache实例 针对所有Cache实例和方法缓存的自动统计 Key的生成策略和value的序列化策略是可以配置的
asp.net缓存 在数据表不改变的情况下 不去查询数据库
FastOpenStruct是Ruby OpenStruct的重新实现,可以避免在每次实例化时使MRI的方法缓存无效。 应该可以替代OpenStruct。 表现 当您的OpenStructs倾向于具有静态属性集时,FastOpenStruct会非常快: λ ruby -I./...
JSP禁用缓存常用方法 该方法不错哦!
phpFastCache是一个开源的PHP缓存库。它有多种方法缓存(APC,memcache中,memcached的,WINCACHE,文件,PDO和MPDO)的支持,缓存的周期可以被定义,有一个非常简单的API。
iBATIS缓存的使用方法
清理缓存的方法
不缓存JS的方法其实挺简单,CSS在某种条件下也可以如此使用; 先让大家了解下不缓存的一个简单的原理: 当浏览不同Url时,浏览器会自动将当前访问的地址进行一次缓存;而第二次访问时着调用缓存下来的页面,从而达到...
提供方法解决appscan扫描出来的漏洞《发现可高速缓存的SSL页面》,主要是设置页面不被缓存
三个类文件,有详细的代码说明,是一个常用缓存操作方法 Cache实体(编写的一个缓存容器) CacheObject(缓存的内容,带有创建时间) CacheOperate(最底层的缓存操作) 不用多大改造就能即拿即用
为了减少高速缓存访问功耗, 提出了一种针对循环的基于历史访问路径的指令高速缓存访问预测方法。该方法以循环作为高速缓存访问路预测行为开启的先决条件, 通过指令高速缓存的历史访问路径训练预测器。当循环体再次...
提供dubbo消费者直接使用缓存的能力,当缓存不存在时,再访问远程dubbo服务。 相对于dubbo默认的缓存机制,此项目具有如下优点: 原生dubbo cache机制只能缓存结果到消费者jvm中,并且cache key不能选择。 缓存key...
JS localStorage实现本地缓存的方法,需要的朋友可以参考一下
.net c# memcached缓存获取所有缓存键的方法步骤.docx
一种基于单片机串口通信的数据缓存处理方法.pdf
清除Flash缓存和各种浏览器缓存的方法.docx
3.显示缓存大小/个数,全部清除缓存/单个文件清除缓存/按时间清除缓存方法多样并且都可以自定义路径可扩展性强 4.离线下载功能 5.多种请求类型的判断。也可不遵循,自由随你定。 6.可见的缓存文件
作为.Net框架下开发Web应用程序的主打产品,ASP.NET充分考虑了缓存机制。通过某种方法,将系统需要的数据对象、Web页面存储在内存中,使得Web站点在需要获取这些数据时,不需要经过繁琐的数据库连接、查询和复杂的...
给一个方法加一个缓存特性,那这个方法就会进行缓存。 这个也是网上说的面向切面编程AOP。 AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存、日志等...
主要介绍了C++数据结构与算法之双缓存队列实现方法,结合实例形式分析了双缓存队列的原理、实现方法与相关注意事项,需要的朋友可以参考下