hibernate-一个Spring4Hibernate4的开源项目,spring注解了接口,这是什么意思?

问题描述

一个Spring4Hibernate4的开源项目,spring注解了接口,这是什么意思?

//Service
@Service
@Transactional
public class UserLogonLogService extends BaseService {
@Autowired
private UserLogonLogDao userLogonLogDao;

    ...
//Dao
@Repository

public interface UserLogonLogDao extends BaseDao {

看着UserLogonLogDao是个接口,就没有找到关于这个接口的实现代码,那他怎么运作呢?
来源:https://github.com/xautlx/s2jh4net/blob/master/src/main/webapp/docs/markdown/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE.md

解决方案

Spring4+Hibernate4配置注解事务控制

解决方案二:

既然有自动注入,而这个接口又是你自定义的,当然是有实现类的。在这个接口文件中,选中这个接口名称后按Ctrl+T查看这个类型层次结构图,就能知道有哪些实现类了。

解决方案三:

既然是接口那就肯定有实现它的地方.

你看看自己配制的Bean的XML中有没有定义
如果没有你就用userLogonLogDao进行全局检索,都有哪些地方用了

比如动态创建对象的反射代码
或者是哪里配置了代理的对象
。。。
肯定有它对应的实现类对象的

解决方案四:

package lab.s2jh.aud.dao;

@Repository

public interface UserLogonLogDao extends BaseDao {
UserLogonLog findByHttpSessionId(String httpSessionId);
}

这个接口定义了注解:org.springframework.stereotype.Repository;
BaseDao继承自org.springframework.data.jpa.repository.JpaRepository;

实际用到了spring jpa,spring启动扫描包时,会根据注解,产生一个这个接口的代理类,
代理类最基础的工作就是根据泛型参数,让持久层用主键(Long)操作类对象UserLogonLog,

你可以看一下UserLogonLog这个类的实现代码
lab.s2jh.aud.entity.UserLogonLog extends PersistableEntity{

@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "native")
private Long id;

@MetaData(value = "Session编号")
@Column(length = 128, nullable = false, unique = true)
private String httpSessionId;

...

这里定义了实体类Entity的详细信息,最后在这个类里,就可以直接通过spring注入userLogonLogDao

package lab.s2jh.aud.service;

@Service
@Transactional
public class UserLogonLogService extends BaseService {

@Autowired
private UserLogonLogDao userLogonLogDao;

简单的说entity.UserLogonLog定义了所有字段,以及主键这类特殊信息,
UserLogonLogDao extends BaseDao
通过父接口JpaRepository,spring jpa也就知道了如何操作entity.UserLogonLog,
包括更新这个对象,保存这个对象,删除这个对象,以及查找这个对象.
findByHttpSessionId方法也将会自动实现,因为很清楚就是在所有对象中查找指定httpSessionId的.
当然最终的代码实际是hibernate完成的.
spring-jpa.xml中
<!-- Spring Data JPA配置 -->
entity-manager-factory-ref="entityManagerFactory">

/jpa:repositories

这里引用了entityManagerFactory,其定义在

    <!-- JPA Entity Manager 配置, 设置depends-on="cacheManager",确保共享模式下优先加载Spring CacheManager -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    depends-on="cacheManager">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="entityManager" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="${jpa_database_platform}" />
        </bean>
    </property>
    <property name="packagesToScan">
        <list>
            <value>lab.s2jh.core.audit.envers</value>
            <value>lab.s2jh.**.entity</value>
            <value>s2jh.biz.**.entity</value>
        </list>
    </property>

...

所以不再需要你自己实现任何代码了.

解决方案五:

其实mybatis的注解方式,理解起来要简单得多,jpa也是类似只是自动完成更多.

比如一个接口,只要用org.apache.ibatis.annotations.Select 注解了方法
IUsr{
/**消费操作,修改主表余额*/
@Select("select * from usrlist where uid=#{uid}")
public List> getList(int uid);
}

mybatis扫描时,就会自动建立一个代理类,方法getlist你自己都可以猜出来,就是执行注解里的select语句,将返回的结果放到一个list里
这些代码,mybatis的代理类会自动完成.

然后你可以随意将这个代理类注入到其它类
@Autowired
private IUsr adao;

spring会查找到实现Iusr的mybatis的代理类,并将它自动注入
你就可以直接用 adao.getList(1)了.

时间: 2024-12-21 22:10:18

hibernate-一个Spring4Hibernate4的开源项目,spring注解了接口,这是什么意思?的相关文章

ddmenucontroller-cocoapods 如何添加一个没有的开源项目?

问题描述 cocoapods 如何添加一个没有的开源项目? 如ddmenucontrollerpod search DDMenuController 提示找不到 解决方案 参考下面的配置 解决方案二: http://blog.csdn.net/ysy441088327/article/details/8611731 你看一下这个配置

做一个优秀的开源项目,需要注意哪些方面?

摘要 如果你想发布一个开源库,请确保它有以下特点: 清晰的依赖性和安装说明 至少有一个简要的文档指南 修改日志和仓库中的标签 关于支持的语言.运行时.工具版本的信息和项目的成熟度 一个可以让用户提问和交流的邮件列表 缺少任何一项都会造成一些用户的愤怒和沮丧,当然同时也浪费了时间. 怎样让你的开源项目更棒 每年,越来越多的人发布了自己开发的库并且它们开源.这里我们分享一些我们经验,以便你的用户对你的库满意. 这里有一个经验法则: 不要让你的用户生气! 也可以理解为: 不要让你的用户有想要砸电脑的冲

TensorFlow: 如何支持一个成功的开源项目

Google TensorFlow移动项目负责人Pete Warden写到,围绕一个开源项目来创建一个社区需要一系列活动,涉及到支持.pull requests handling.许可使用和更多其他的东西. Warden解释到,新项目在初始阶段的一个大挑战就是为使用者们提供支持.最开始,开发人员们是唯一的专家,他们得想办法把自己的日常工作与其他支持任务相结合.这项工作并不简单,因为它可能将开发人员们带出自己的舒适区,很可能让他们无法专心完成主要任务.TensorFlow团队采用软件工程师轮流的方

想找一个大量依赖shel脚本的java开源项目

问题描述 想找一个大量依赖shel脚本的java开源项目 最新的项目中很多地方需要调用shell脚本进行操作.获取数据.编码过程中遇到很多问题不知道该怎么处理,所以想找一个这样的开源项目,看一下牛人们是怎么操作调用shell脚本的,请大家推荐一些这样的开源项目,谢谢了 解决方案 shell就是一个简单的脚本语言,可以当初编程语言,你可以根据你的需要实现各种功能 解决方案二: 为什么要找java开源项目 shell脚本和java没有任何关系,你只要学习shell就好了啊

如何加入一个开源项目?

原文地址:http://haineault.com/blog/120/                 如何加入一个开源项目? 这不是一篇权威的指南,只是一些你需要遵循的基本规则,这些规则可以让你对开源项目的贡献使得你和项目维护者都感到愉快! 为什么加入一个开源项目? 首先,有很多加入开源项目的动机.排在第一的可能是"酷":)当你告诉你的朋友"嘿,我在XYZ项目开发团队! 我很潮吧?" 但是这并不是一个很好的原因.加入一个开源项目的首先需求是你需要使用它.如果你自己

环信编程大赛优秀开源项目源码放出:文播+图忆

 根据IDC数据显示,中国有近200万开发者,身为一个程序员,我们生活在一个IT系统越发复杂且多变化的时代.有时候执行一个简单的开源项目,开发一个基础功能都需要精准定义并耗费大量时间专注任务.随着云计算的兴起,API和SDK开始作为软件之间重要媒介而作为一种独立应用而存在,"一切皆软件,一切皆API,一切皆SDK".通过API和SDK可以让开发者摆脱繁重的基础功能底层开发,短时间即可让App拥有各种诸如内置IM.统计等基础功能组件能力.       5月14日,由环信联合猿圈共同推出的

视频会议十大开源项目排行

在http://www.aliyun.com/zixun/aggregation/18237.html">视频会议领域,有许多可以值得参考的开源项目,这些开源项目有的是协议栈.有的是编码器或者是传输协议,由于视频会议系统是一个综合性的应用系统,里面包含功能较多,如能把这些开源项目选择性的加入我们的视频会议开发当中,我们的开发效率肯定会事半功倍,下面我们列举一下视频会议相关的十大开源项目,并对其重要性及优缺点做一个全面的评价与排名. 1. OpenH323项目 (★★★★★) 上榜理由:最著

视频会议及流媒体十大开源项目

在视频会议领域,有许多可以值得参考的开源项目,这些开源项目有的是协议栈.有的是编码器或者是传输协议,由于视频会议系统是一个综合性的应用系统,里面包含功能较多,如能把这些开源项目选择性的加入我们的视频会议开发当中,我们的开发效率肯定会事半功倍,下面我们列举一下视频会议相关的十大开源项目,并对其重要性及优缺点做一个全面的评价与排名. 1. OpenH323项目        () 上榜理由:最著名的H.323开源协议栈,视频会议开发必备协议栈,强烈推荐 最著名的H.323开源协议栈,包含了全部的H.

&quot;Goole项目托管&quot;及&quot;CodePlex发布开源项目&quot;要点

一.google项目托管相对比较容易 http://code.google.com/ 先注册一个gmail邮箱,然后参考孟子的这篇文章http://blog.csdn.net/net_lover/archive/2009/04/08/4056916.aspx 二.CodePlex开源项目--这个相对麻烦一点 http://www.codeplex.com/ 得先注册一个帐号,然后创建项目,默认情况下项目是未发布状态,得先上传源代码并选择License后才能publish,关键是Source Co