spring3.2+ehcache注記の使用
私はずっとhibernateが好きではありませんが、フレームワークはspring mvc+hibernateで構築されています.そして、私は自分でSQLを書くのが好きです.データ層は自分でカプセル化しても物を書くのが好きです.hql文を使っていません.彼のキャッシュも使っていません.自分も一部のデータをキャッシュしたいので、自分でキャッシュを書きたいです.あるいは、既製のキャッシュを使って、springでブロックして、粒度が細いことを実現したいです.制御しやすいキャッシュ.わかりました.spring 3.0以降は3.1以降でしょう.注釈方式のキャッシュが実現しました.以下は私が自分で作った例です.皆さんに共有します.
例:
1.データベースを使わず、集合の中のデータを使ったり、トランザクションがなかったりして、CRUD操作を完了します.
2.第1回目のクエリ、繰り返しクエリ、キャッシュが有効かどうか、更新後のデータ同期の問題を含む主なテスト内容
3.共通パラメータバインドなども含む
4.簡単な内容のために、私はインタフェースを使用していません.つまり、User、UserControl、UserServer、UserDaoのいくつかのクラス、xmlプロファイルです.
直接クラスを見て、ソースファイル、jarはすべてアップロードして、みんながダウンロードするのに便利です:
XML構成:
JSP構成:
テスト方法について
入力アドレス:http://localhost:8081/springEhcache/jsp/view
そしてIDに基づいてクエリー編集、追加、削除などの操作を行います.ここでは簡単な例を作るだけで、もっと自分で書く必要があります.テスト用例の私も導入しましたので、業務は自分で書くことができます.
参考資料がたくさん使われています.
例:
これはgoogleが作った例で、実例のプロジェクトは似ていて、アップロードしません
http://blog.goyello.com/2010/07/29/quick-start-with-ehcache-annotations-for-spring/
これは涛geで、spring cacheに対するいくつかの解釈です
http://jinnianshilongnian.iteye.com/blog/2001040
それからspringの公式サイトのいくつかの資料で、私は自分の下のsrcで、中のドキュメントはすべてあって、アップロードすることができます
自分のパスのファイルアドレス/spring-3.2.0.M2/docs/reference/htmlsingle/index.html
Ehcacheの紹介については、参考になります
公式サイト:http://www.ehcache.org/documentation/get-started/cache-topologies
また、私のキャッシュ分類の中で回っている文章もあります.いくつかの主流のキャッシュ分類と違いについてです.
まとめ:
1.今aopとDIはたくさん使って、とても便利で、しかしフレームワークは多すぎて、しかし核心のソースコードをはっきりさせなければなりません
2.上のキャッシュメカニズムはクラスにも応用でき、事務と差が少ない.どうせ中身が多いから、一つ一つ紹介しないで、自分で拡張研究をすることができる.
3.springのキャッシュを感じて、粒度は更に細くて、精確に要素に着くことができて、あるいは指定の方法に対して、指定の内容の時間制御を提供することができて、xmlだけを通じてではありませんて、方法の上で直接パラメータをプラスして、要素のキャッシュ時間を細分化することができて、この点の作用について言えば、私のプロジェクトの中で、例えばA結果セット、私は10秒キャッシュしたいと思って、B結果セットは50秒キャッシュしたいと思って、キャッシュを再構成する必要はありません.そしてehcacheは元素級の粒子制御をサポートしているので、それぞれ考えがあるでしょう.もちろん自分がxml方式でブロックするのが好きなのか、それとも注釈で使うのか、ここでは注釈方式だけを提供していますが、私は比較的好きです~.~
4.問題のあるところはみんなを歓迎して、多く指摘します!
10 Mを超えてはいけません.プロジェクトやドキュメントの紹介を含めて、別々に伝えます.
例:
1.データベースを使わず、集合の中のデータを使ったり、トランザクションがなかったりして、CRUD操作を完了します.
2.第1回目のクエリ、繰り返しクエリ、キャッシュが有効かどうか、更新後のデータ同期の問題を含む主なテスト内容
3.共通パラメータバインドなども含む
4.簡単な内容のために、私はインタフェースを使用していません.つまり、User、UserControl、UserServer、UserDaoのいくつかのクラス、xmlプロファイルです.
直接クラスを見て、ソースファイル、jarはすべてアップロードして、みんながダウンロードするのに便利です:
package com.se;
public class User {
public Integer id;
public String name;
public String password;
// ,
public User(){}
public User(Integer id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ "]";
}
}
package com.se;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
/**
* ,
*/
@Repository("userDao")
public class UserDao {
List<User> users = initUsers();
public User findById(Integer id){
User user = null;
for(User u : users){
if(u.getId().equals(id)){
user = u;
}
}
return user;
}
public void removeById(Integer id){
User user = null;
for(User u : users){
if(u.getId().equals(id)){
user = u;
break;
}
}
users.remove(user);
}
public void addUser(User u){
users.add(u);
}
public void updateUser(User u){
addUser(u);
}
//
private List<User> initUsers(){
List<User> users = new ArrayList<User>();
User u1 = new User(1," ","123");
User u2 = new User(2," ","124");
User u3 = new User(3," ","125");
users.add(u1);
users.add(u2);
users.add(u3);
return users;
}
}
package com.se;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
* ,
*/
@Service("userService")
public class UserService {
@Autowired
private UserDao userDao;
// , key, + + key
@Cacheable(value = "serviceCache")
public List<User> getAll(){
printInfo("getAll");
return userDao.users;
}
// ID ,ID
@Cacheable(value = "serviceCache", key="#id")
public User findById(Integer id){
printInfo(id);
return userDao.findById(id);
}
// ID
@CacheEvict(value = "serviceCache", key="#id")
public void removeById(Integer id){
userDao.removeById(id);
}
public void addUser(User u){
if(u != null && u.getId() != null){
userDao.addUser(u);
}
}
// key , condition , id < 10
// , spring
@CacheEvict(value="serviceCache", key="#u.id")
public void updateUser(User u){
removeById(u.getId());
userDao.updateUser(u);
}
// allEntries , , false,
// beforeInvocation , ,
@CacheEvict(value="serviceCache",allEntries=true)
public void removeAll(){
System.out.println(" ");
}
private void printInfo(Object str){
System.out.println(" ----------findById"+str);
}
}
package com.se;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserControl {
@Autowired
private UserService userService;
// , ,
@ModelAttribute("users")
public List<User> cityList() {
return userService.getAll();
}
// ID
@RequestMapping("/get/{id}")
public String getUserById(Model model,@PathVariable Integer id){
User u = userService.findById(id);
System.out.println(" :"+u);
model.addAttribute("user", u);
return "forward:/jsp/edit";
}
//
@RequestMapping("/del/{id}")
public String deleteById(Model model,@PathVariable Integer id){
printInfo(" -----------");
userService.removeById(id);
return "redirect:/jsp/view";
}
//
@RequestMapping("/add")
public String addUser(Model model,@ModelAttribute("user") User user){
printInfo(" ----------");
userService.addUser(user);
return "redirect:/jsp/view";
}
//
@RequestMapping("/update")
public String update(Model model,@ModelAttribute User u){
printInfo(" ---------");
userService.updateUser(u);
model.addAttribute("user", u);
return "redirect:/jsp/view";
}
//
@RequestMapping("/remove-all")
public String removeAll(){
printInfo(" -------------");
userService.removeAll();
return "forward:/jsp/view";
}
// JSP
@RequestMapping("/jsp/{jspName}")
public String toJsp(@PathVariable String jspName){
System.out.println("JSP TO -->>" +jspName);
return jspName;
}
private void printInfo(String str){
System.out.println(str);
}
}
XML構成:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>springEhcache</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:com/config/springmvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!-- service -->
<cache name="serviceCache"
eternal="false"
maxElementsInMemory="100"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="0"
timeToLiveSeconds="300"
memoryStoreEvictionPolicy="LRU" />
</ehcache>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:oxm="http://www.springframework.org/schema/oxm"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- @Component @Repository @Service @Controller -->
<context:component-scan base-package="com.se" />
<!-- @RequestMapping -->
<mvc:annotation-driven />
<!-- -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- -->
<!-- <mvc:default-servlet-handler/> -->
<mvc:resources location="/*" mapping="/**" />
<!-- -->
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:com/config/ehcache.xml"/>
</bean>
<!-- -->
<cache:annotation-driven cache-manager="cacheManager" />
<!-- cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="cacheManagerFactory"/>
</bean>
</beans>
JSP構成:
<%@ page language="java" contentType="text/html; charset=Utf-8" pageEncoding="Utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-1.4.3.js"></script>
<body>
<strong> </strong><br>
:<input id="userId">
<a href="#" id="edit"> </a>
<a href="#" id="del" > </a>
<a href="<%=request.getContextPath()%>/jsp/add"> </a>
<a href="<%=request.getContextPath()%>/remove-all"> </a><br/>
<p> :<p/>
${users }
<p> :</p>
<img style="width: 110px;height: 110px" src="<%=request.getContextPath()%>/img/404cx.png"><br>
</body>
<script type="text/javascript">
$(document).ready(function(){
$('#userId').change(function(){
var userId = $(this).val();
var urlEdit = '<%=request.getContextPath()%>/get/'+userId;
var urlDel = '<%=request.getContextPath()%>/del/'+userId;
$('#edit').attr('href',urlEdit);
$('#del').attr('href',urlDel);
});
});
</script>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<script type="text/javascript" src="../js/jquery-1.4.3.js"></script>
<body>
<strong> </strong><br>
<form id="edit" action="<%=request.getContextPath()%>/update" method="get">
ID:<input id="id" name="id" value="${user.id}"><br>
:<input id="name" name="name" value="${user.name}"><br>
:<input id="password" name="password" value="${user.password}"><br>
<input value=" " id="update" type="submit">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="../js/jquery-1.4.3.js"></script>>
<body>
<strong> </strong>
<form action="<%=request.getContextPath()%>/add" method="post">
ID:<input name="id" ><br>
:<input name="name" ><br>
:<input name="password"><br>
<input value=" " id="add" type="submit">
</form>
${users }
</body>
</html>
テスト方法について
入力アドレス:http://localhost:8081/springEhcache/jsp/view
そしてIDに基づいてクエリー編集、追加、削除などの操作を行います.ここでは簡単な例を作るだけで、もっと自分で書く必要があります.テスト用例の私も導入しましたので、業務は自分で書くことができます.
参考資料がたくさん使われています.
例:
これはgoogleが作った例で、実例のプロジェクトは似ていて、アップロードしません
http://blog.goyello.com/2010/07/29/quick-start-with-ehcache-annotations-for-spring/
これは涛geで、spring cacheに対するいくつかの解釈です
http://jinnianshilongnian.iteye.com/blog/2001040
それからspringの公式サイトのいくつかの資料で、私は自分の下のsrcで、中のドキュメントはすべてあって、アップロードすることができます
自分のパスのファイルアドレス/spring-3.2.0.M2/docs/reference/htmlsingle/index.html
Ehcacheの紹介については、参考になります
公式サイト:http://www.ehcache.org/documentation/get-started/cache-topologies
また、私のキャッシュ分類の中で回っている文章もあります.いくつかの主流のキャッシュ分類と違いについてです.
まとめ:
1.今aopとDIはたくさん使って、とても便利で、しかしフレームワークは多すぎて、しかし核心のソースコードをはっきりさせなければなりません
2.上のキャッシュメカニズムはクラスにも応用でき、事務と差が少ない.どうせ中身が多いから、一つ一つ紹介しないで、自分で拡張研究をすることができる.
3.springのキャッシュを感じて、粒度は更に細くて、精確に要素に着くことができて、あるいは指定の方法に対して、指定の内容の時間制御を提供することができて、xmlだけを通じてではありませんて、方法の上で直接パラメータをプラスして、要素のキャッシュ時間を細分化することができて、この点の作用について言えば、私のプロジェクトの中で、例えばA結果セット、私は10秒キャッシュしたいと思って、B結果セットは50秒キャッシュしたいと思って、キャッシュを再構成する必要はありません.そしてehcacheは元素級の粒子制御をサポートしているので、それぞれ考えがあるでしょう.もちろん自分がxml方式でブロックするのが好きなのか、それとも注釈で使うのか、ここでは注釈方式だけを提供していますが、私は比較的好きです~.~
4.問題のあるところはみんなを歓迎して、多く指摘します!
10 Mを超えてはいけません.プロジェクトやドキュメントの紹介を含めて、別々に伝えます.