跳至主要内容

Spring JCache support


Spring JCache support

Spring 4 provides seamless JCache integration.

Enable Caching

In this example, use EhCache as JCache specification provider.
Add @EnableCaching(mode=AdviceMode.ASPECTJ) annotation on the configuration class if you are using Java based configuration.
@Configuration
...
@EnableCaching(mode=AdviceMode.ASPECTJ)
public class JpaConfig {...}
Then, specify a CacheManager provider in your configuration.
@Override
@Bean
public CacheManager cacheManager() {
 JCacheCacheManager cacheManager = new JCacheCacheManager();
 cacheManager.setCacheManager(new JCacheManager(
   new JCacheCachingProvider(), ehcache(), null, null));
 return cacheManager;
}

private net.sf.ehcache.CacheManager ehcache() {
 return new net.sf.ehcache.CacheManager();
}

@Override
@Bean
public KeyGenerator keyGenerator() {
 return new SimpleKeyGenerator();
}
Do not forget to add the ehcache-core, jcache, cache-api dependencies in your Maven pom.xml file.
<dependency>
 <groupId>net.sf.ehcache</groupId>
 <artifactId>ehcache-core</artifactId>
</dependency>

<dependency>
 <groupId>org.ehcache</groupId>
 <artifactId>jcache</artifactId>

</dependency>
<dependency>
 <groupId>javax.cache</groupId>
 <artifactId>cache-api</artifactId>
</dependency>

Use JCache API

Like Spring core, JCache APIs provides a series of annotations for cache operations.
@Repository
public class JpaConferenceRepositoryImpl implements ConferenceRepository {
 private static final Logger log = LoggerFactory
   .getLogger(JpaConferenceRepositoryImpl.class);

 @PersistenceContext
 private EntityManager entityManager;

 @Override
 @CacheResult(cacheName = "conference")
 public Conference findById(Long id) {
  return (Conference) entityManager.find(Conference.class, id);

 }

 @Override
 @CachePut(cacheName = "conference" )
 public Conference save(final Conference conference) {
  if (conference.isNew()) {
   entityManager.persist(conference);
   entityManager.flush();
   return conference;
  } else {
   Conference conf = entityManager.merge(conference);
   entityManager.flush();
   return conf;
  }
 }

 
 @Override
 @CacheRemove(cacheName = "conference" )
 public void delete(final Long id) {
  entityManager.remove(entityManager.find(Conference.class, id));
  entityManager.flush();
 }
 
 @Override
 @CacheRemove(cacheName = "conference" )
 public void delete(final Conference conf) {
  entityManager.remove(entityManager.merge(conf));
  entityManager.flush();
 }

 @Override
 @CacheRemoveAll(cacheName = "conference")
 public void deleteAll() {
  List<Conference> all = entityManager.createQuery("from Conference",
    Conference.class).getResultList();
  for (Conference c : all) {
   delete(c);
  }
  entityManager.flush();
 }

 @Override
 @CacheResult(cacheName = "conference")
 public Conference findBySlug(String slug) {
  List<Conference> all = entityManager
    .createQuery("from Conference where slug=:slug",
      Conference.class).setParameter("slug", slug)
    .getResultList();
  if (!all.isEmpty()) {
   return all.get(0); 
  }

  return null;
 }
}
Spring JCache support can reuse the Spring Caching configuration, but use JCache APIs in codes..

Code sample

Check out the sample codes.
And explore the spring-jcache folder.

评论

此博客中的热门博文

Build a Reactive application with Angular 5 and Spring Boot 2.0

I have created a post to describe Reactive programming supports in Spring 5 and its subprojects, all codes of this article are updated the latest Spring 5 RELEASE, check spring-reactive-sample under my Github account.
In this post, I will create a simple blog system, including:
A user can sign in and sign out.An authenticated user can create a post.An authenticated user can update a post.Only the user who has ADMIN role can delete a post.All users(including anonymous users) can view post list and post details.An authenticated user can add his comments to a certain post. The backend will be built with the latest Spring 5 reactive stack, including:
Spring Boot 2.0, at the moment the latest version is 2.0.0.M7Spring Data MongoDB supports reactive operations for MongoDBSpring Session adds reactive support for WebSessionSpring Security 5 aligns with Spring 5 reactive stack The frontend is an Angular based SPA and it will be generated by Angular CLI.
The source code is hosted on Github, …

Activating CDI in JSF 2.3

Activating CDI in JSF 2.3 When I upgraded my Java EE 7 sample to the newest Java EE 8, the first thing confused me is the CDI beans are not recoganized in Facelects template in a JSF 2.3 based web applicaiton, which is working in the development version, but in the final release version, they are always resolved as null. I filed an issue on Mojarra and discussed it with the developers from communities and the JSF experts.
According to the content of README, In a JSF 2.3 application, to activate CDI support, declaring a 2.3 versioned faces-config.xml and adding javax.faces.ENABLE_CDI_RESOLVER_CHAIN in web.xml is not enough, you have to declare @FacesConfig annotated class to enable CDI.
Here is the steps I created a workable JSF 2.3 applicatoin in Java EE 8.
Create a Java web application, this can be done easily by NetBeans IDE, or generated by Maven archetype, for exmaple.
$ mvn archetype:generate -DgroupId=com.example -DartifactId=demo -DarchetypeArtifactId=maven-archetype-we…

JSF 2.3:Websocket support

Websocket support One of the most attractive features is JSF 2.3 added native websocket support, it means you can write real-time applications with JSF and no need extra effort.
To enable websocket support, you have to add javax.faces.ENABLE_WEBSOCKET_ENDPOINT in web.xml.
<context-param> <param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name> <param-value>true</param-value> </context-param> Hello Websocket Let's start with a simple example.
@ViewScoped@Named("helloBean") publicclassHelloBeanimplementsSerializable { privatestaticfinalLoggerLOG=Logger.getLogger(HelloBean.class.getName()); @Inject@PushPushContext helloChannel; String message; publicvoidsendMessage() { LOG.log(Level.INFO, "send push message"); this.sendPushMessage("hello"); } privatevoidsendPushMessage(Objectmessage) { helloChannel.send(""+ message +" at &…