- 浏览: 753219 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
a offset: 26b offset: 24c offse ...
java jvm字节占用空间分析 -
ls0609:
语音实现在线听书http://blog.csdn.net/ls ...
Android 语音输入API使用 -
wangli61289:
http://viralpatel-net-tutorials ...
Android 语音输入API使用 -
zxjlwt:
学习了素人派http://surenpi.com
velocity宏加载顺序 -
tt5753:
谢啦........
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
通常在数据库DAO层的查询中,我们会定义一个DAO接口,而在实现中我们只是拼接查询参数并且指定一个ibatis的sqlmap中的sqlid进行查询,
Dao的实现很类似,而且非常简单,其实可以简化这种的实现,不需要这些实现代码,下面我们通过annotation机制来简化这块的实现。
比如
public class TestDaoImpl extends SqlMapClientDaoSupport implements TestDao { @Override public int updateBrandOfferStatusByBrandMemberId(Long brandMemberId, String operator, String status) { Map<String, Object> map = new HashMap<String, Object>(); map.put("brandMemberId", brandMemberId); map.put("operator", operator); map.put("status", status); return this.getSqlMapClientTemplate().update("BRANDOFFER.UPDATE-BRANDOFFER-BY-BRANDMEMBERID", map); } @Override public List<Long> queryOfferIdsByBrandMemberId(Long brandMemberId, Integer start, Integer end) { Map<String, Object> map = new HashMap<String, Object>(); map.put("brandMemberId", brandMemberId); map.put("start", start); map.put("end", end); return this.getSqlMapClientTemplate().queryForList("BRANDOFFER.SELECT-OFFERIDLIST-BY-BRANDMEMBERID", map); } ...... }
首先,我们使用建立一个spring的工程,依赖如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>mySpringWeb</groupId> <artifactId>springDemo</artifactId> <packaging>jar</packaging> <version>1.0.0-SNAPSHOT</version> <name>Started with Laurel</name> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.0.RELEASE</version> </dependency> </dependencies> <repositories> <repository> <id>springsource-repo</id> <name>SpringSource Repository</name> <url>http://repo.springsource.org/release</url> </repository> </repositories> </project>
我们定义两个annotation
DAO是用来加在DAO接口的方法上的annotaion,可以通过name指定ibatis中的sql id,这个annotation可以添加type之类的参数,可以用来指定dao查询的类型,inserti,update,query,delete等类型。
package mySpringWeb; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Inherited @Target({ ElementType.METHOD, ElementType.TYPE}) public @interface Dao { String name() default "[defaultMethod]"; }
DaoParam是用来在DAO方法的参数上加的annotation,用来指定ibatis查询map参数的构造,map的key名称
package mySpringWeb; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Inherited @Target({ElementType.FIELD, ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.PARAMETER}) public @interface DaoParam { String name() default "paramName"; }
然后定义一个DAO接口,里面有一个方法,
package mySpringWeb; import java.util.List; public interface MyDao { @Dao(name="MyDaoAnnotataion") public List<Object> query(@DaoParam(name="param1")String param1, @DaoParam(name="param2")int param2); }
我们写一个空的DAO实现类,
package mySpringWeb; import java.util.List; public class MyDaoImpl implements MyDao{ @Override public List<Object> query(@DaoParam(name="param1")String param1, @DaoParam(name="param2")int param2) { // TODO Auto-generated method stub return null; } }
然后就是写一个spring AOP的 拦截器类了,
package mySpringWeb; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.core.annotation.AnnotationUtils; public class MyIntercept implements MethodInterceptor{ static{ try { Class.forName("mySpringWeb.Dao"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public Object invoke(MethodInvocation invocation) throws Throwable { Dao dao = AnnotationUtils.findAnnotation(invocation.getMethod(), Dao.class);//递归查找该方法是否定义了这个annotation if(dao != null){ List<String> list = new ArrayList<String>(); list.add(dao.name()); System.out.println(dao.name()); //method name就是ibatis sqlid,这里可以注入一个dao,然后传入sqlid,执行返回 System.out.println(invocation.getMethod().getName()); Map<String,Object> paraMap = new HashMap<String,Object>(); Annotation[][] annotations = invocation.getMethod().getParameterAnnotations(); Object[] object = invocation.getArguments(); for(int i = 0; i < annotations.length;i++){ for(Annotation an: annotations[i]){ if(an.annotationType().isAssignableFrom(DaoParam.class)){ System.out.println(an.toString()); paraMap.put(((DaoParam)an).name(), object[i]); } } } //dao查询参数map System.out.println(paraMap.toString()); //这里ibatis sqlid和查询参数map都知道,那么就可以进行数据库查询,然后返回了,对于返回类型也可以通过定义返回的annotation进行返回参数类型的几种定义 //当前这里需要注入spring的DAO的一个实现,这里根据annotation的类型和参数以及sqlid就可以进行数据库查询,然后返回,这里就比较简单了。 return list; } System.out.println("go to here error"); return null; } }
再进行spring的bean xml配置,bean.xml,这里可以对多个DAO进行配置同一个拦截器,然后就可以统一处理了。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="mydao" class="mySpringWeb.MyDaoImpl" /> <bean id="myintercept" class="mySpringWeb.MyIntercept" /> <bean id="mydaobean" class=" org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>mySpringWeb.MyDao</value> </property> <property name="interceptorNames"> <list> <value>myintercept</value> <value>mydao</value> </list> </property> </bean> </beans>
写一个测试类:
package mySpringWeb; import java.util.List; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { // @Resource // private MyDao myDao; // // public void test(){ // List<Object> list = myDao.query(); // System.out.println(list); // } public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { MyDao myDao = (MyDao) new ClassPathXmlApplicationContext("bean.xml").getBean("mydaobean"); List<Object> list = myDao.query("test1", 1); System.out.println(list); // System.out.println(myDao.toString()); // MyDao myDao1 = (MyDao) Class.forName("mySpringWeb.MyDaoImpl").newInstance(); // Method[] methods = myDao1.getClass().getMethods(); // for(Method method: methods){ // Annotation[] annos = method.getAnnotations(); // for(Annotation anno: annos){ // System.out.println(anno.getClass().getName()); // } // } } }
输出:
MyDaoAnnotataion query @mySpringWeb.DaoParam(name=param1) @mySpringWeb.DaoParam(name=param2) {param1=test1, param2=1} [MyDaoAnnotataion]
这种方式就可以简化DAO实现的一堆重复逻辑,通过在DAO 的interface中annotation定义好就可以了。
不过有个优化,不知道有没有办法不用定义每一个DAO的空实现类,应该是有办法的。具体的后面再研究。还有annotation如果直接通过invocation.getMethod().getAnnotation()是获取不到接口中定义的annotation的,必须得通过AnnotationUtils.findAnnotation(invocation.getMethod(), Dao.class);这个方法查询方法的annotation。
发表评论
-
对字符串进行验证之前先进行规范化
2013-09-17 23:18 13947对字符串进行验证之前先进行规范化 应用系统中经常对字 ... -
使用telnet连接到基于spring的应用上执行容器中的bean的任意方法
2013-08-08 09:17 1471使用telnet连接到基于spring的应用上执行容器中 ... -
jdk7和8的一些新特性介绍
2013-07-06 16:07 10110更多ppt内容请查看:htt ... -
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
2013-06-28 21:35 11798原文链接: http://www.javaarch.net ... -
java对于接口和抽象类的代理实现,不需要有具体实现类
2013-06-12 09:50 2952原文链接:http://www.javaarch.net/j ... -
HTML5 DNS & Content 预取
2013-06-07 09:57 950HTML5 DNS & Content 预取 ... -
Java EE 7中对WebSocket 1.0的支持
2013-06-05 09:27 3837原文链接:http://www.javaarch.n ... -
自动删除javascript中的logging语句
2013-06-05 09:26 783原文地址:http://www.javaarch.n ... -
Spring rest对etag支持
2013-06-03 00:06 992原文地址:http://www.jav ... -
Spring Security Logout
2013-06-03 00:05 2369原文地址:http://www.javaarch.net/ ... -
Spring Security Basic Authentication
2013-06-03 00:04 1739原文地址:http://www.javaarch.net/ ... -
Spring Security Form Login
2013-06-02 16:16 2146原文地址:http://www.javaarch.net/j ... -
spring3 的restful API RequestMapping介绍
2013-06-02 14:53 1152原文链接:http://www.javaarch.net/j ... -
Html5 表单验证和style css验证支持
2013-06-02 12:16 806原文链接:http://www.java ... -
HTML5 Fullscreen API html5全屏编程API
2013-06-02 11:59 4229原文地址:http://www.javaarch.net/j ... -
chrome浏览器的桌面通知规范desktop notifications
2013-05-31 22:43 1585原文链接:http://www.javaarch.ne ... -
javascript Page Visibility API
2013-05-31 13:30 1889原文链接:http://www.javaarch.net/j ... -
Java Web使用swfobject调用flex图表
2013-05-28 19:05 1121Java Web使用swfobject调用 ... -
JAVASCRIPT 浏览器兼容性问题及解决方案列表
2013-05-28 18:57 1684原文链接http://www.javaarch.net ... -
spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置
2013-05-21 15:57 3332spring使用PropertyPlaceholderCon ...
相关推荐
在Spring框架中,AOP(面向切面编程)是一种...通过上述方式,我们可以有效地利用Spring AOP实现分层日志记录,提高代码的可维护性和问题排查效率。同时,合理的日志设计和管理对于任何应用程序来说都是至关重要的。
在Spring中,AOP是通过定义切面(Aspect)和通知(Advice)来实现的,切面定义了关注点的逻辑结构,而通知则定义了何时、何地以及如何执行这些逻辑。 接下来,我们引入EHCache。EHCache支持本地内存缓存、分布式...
Spring框架是Java开发中不可或缺的一部分,它通过提供丰富的注解简化了依赖注入、配置管理和AOP(面向切面编程)等任务。本文将深入探讨Spring注解及其在实际开发中的应用。 1. **依赖注入(Dependency Injection, ...
最后,为了实现读写分离,你需要在服务层或者DAO层的接口和实现类中使用上述注解。例如: ```java public interface UserService { @ReadOnly User getUserById(Long id); @Transactional void updateUser...
这通常涉及创建一个`Log`实体类,以及对应的DAO接口和实现类。在日志通知中,创建并填充`Log`对象,然后调用DAO方法将其持久化。 7. **异常处理**: 当发生异常时,异常通知会被触发。我们可以在通知方法中捕获...
package com.spring.dao; import org.springframework.stereotype.Component; @Component("userDAO") public class UserDao { public void say() { System.out.println("say method is called"); } public ...
这个"spring+hibernate annotation 完整示例,带数据库脚本"的项目,旨在提供一个全面的示例,帮助开发者了解如何在实际项目中结合Spring和Hibernate使用注解来实现数据访问。下面我们将深入探讨这些知识点。 1. **...
4. **DAO层**:创建DAO接口和实现类,使用Spring的`@Repository`注解标记DAO实现类,以便Spring自动处理事务。例如: ```java public interface UserRepository { User findById(Long id); // 其他方法... } ...
- **Spring Boot集成**:利用Spring Boot的自动配置特性,简化Spring和Hibernate的整合,只需少量配置甚至无配置即可快速启动项目。 在实际开发中,这三种实现方式各有优劣,开发者可以根据项目的规模、团队习惯和...
总之,Spring AOP 切点函数通过灵活的表达式和通配符机制,使得开发者能够精确地控制拦截哪些方法,从而实现代码的解耦和模块化。理解并熟练运用这些函数,能极大地提升Spring应用的维护性和可扩展性。
这里主要讨论的是如何将这三者结合,并利用注解(Annotation)进行配置,以简化开发过程。 Struts2是MVC(模型-视图-控制器)框架,主要负责处理HTTP请求和控制应用的流程。它通过Action类处理业务逻辑,使用拦截器...
根据提供的文件信息,内容涉及Spring框架中的IoC(控制反转)和Annotation(注解),以及使用这些技术进行数据库操作的CRUD示例。同时,内容中提到了C3P0连接池和DBUtils的使用,以及JUnit测试框架。下面将详细介绍...
5. **整合Spring和Hibernate**:使用Spring的HibernateDaoSupport类或JpaTemplate来简化DAO层的代码,通过Spring管理SessionFactory或EntityManagerFactory。 6. **测试和运行**:编写JUnit测试,验证各个组件是否...
在本项目"spring-txn-annotation-demo.zip"中,我们主要关注的是如何使用Spring框架的注解来管理事务,这是一个适合初学者学习和研究的示例。该项目基于Spring 5.0.2版本,结合Maven构建工具以及IntelliJ IDEA(一个...
- `spring_aop_annotation` 文件夹包含的是使用注解方式实现的 AOP 示例。在 Spring 中,AOP 允许开发者定义“切面”,将关注点(如日志、事务管理)与业务逻辑分离。通过 @Aspect 注解定义切面,@Before、@After、...
总结:Spring AOP提供了两种配置方式,分别是注解配置和XML配置。注解配置更加简洁、直观,适合简单的切面定义;而XML配置则更为灵活,适用于复杂的场景,可以精细控制通知的顺序和作用域。在实际开发中,可以根据...
在DAO接口上使用@Repository,利用Spring的代理机制实现事务控制。 通过这样的整合,开发者可以利用SpringMVC处理HTTP请求,Spring管理业务逻辑和服务,Hibernate处理数据库操作,形成一个完整的Web应用架构。这样...
Spring是一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,而Hibernate则是一个强大的ORM(对象关系映射)工具,用于简化数据库操作。当我们将这两个框架整合在一起时,...
5. 编写DAO接口和实现,使用Hibernate的Session进行数据库操作。 6. 创建服务层接口和实现,注入DAO,提供业务逻辑。 7. 在Struts2的动作类中注入服务层,处理用户请求。 这样的整合项目使得开发更高效,因为每个...