spring 管理hibernate实体

唐代de豆腐 发布于 2014/07/27 11:06
阅读 255
收藏 0

也总是用Spring+HIbernate.但实际上没有去跟代码。

现在我就想知道如何得到Hibernate所有实体对象,但不知道Spring哪个类管理 了。实际看了下是这个类加载的:

LocalSessionFactoryBean,,但跟下去没东西了。

之前也有过一个想法,,想得到Spring3 所有管理的Controller对象。但也是没有找到是哪个类》其实我也没有仔细找。。


加载中
0
逝水fox
逝水fox

Spring 获取上下文中所有指定类型的Bean,可以用 ApplicationContext的(实际是BeanFactory定义的)getBeansOfType(Class<T>)。

至于Hibernate实体对象,这个你是找错方向了,实体bean是和Hibernate的Session关联的,并不直接受Spring管理,你应该去查Hibernate的代码。

0
zfc827
zfc827

你都说了是你没仔细找了,怎么能怪框架害人呢。

前阵子看了一段话送给你:

作为一个初学者或者进阶者,这并没有什么错。当一个有能力的程序员而不是领导者,这也没有什么错。真正的错误是,当你知道应该如何去提高时仍然选择做一名初学者。

给有相同问题的朋友解答一下:

Hibernate 把实体bean的相关信息,抽象成一个元数据概念,具体的接口是org.hibernate.metadata.ClassMetadata,它提供了一系列的方法,比如获取Entity 名字,Class Type,Property等等,具体的大家看一下API就明白了

这个接口通过Hibernate的顶级接口SessionFactory获取,比如,通过SessionFactory#getAllClassMetadata()方法就能获取到所有的实体Bean信息了。

SpringMVC 也有类似的设计。

首先是将请求的映射关系封装成了一个叫做 org.springframework.web.servlet.mvc.method.RequestMappingInfo 的对象,这个对象包含了一系列的映射匹配条件,待接受到请求后,通过此对象和请求进行比较,比如请求参数类型名字是否匹配,URL参数是否匹配等等。

然后是将请求具体的处理方法封装成了一个叫做 org.springframework.web.method.HandlerMethod的对象,也就是我们的 Controller 对象中处理请求的方法,这个对象同样也包含很多处理方法相关的信息。

比如:
HandlerMethod#getBean() // 获取处理方法的Controller对象的实例
HandlerMethod#getBeanType()// 获取 Controller 的类型
HandlerMethod#getMethod() // 获取处理的方法反射 Method 对象
HandlerMethod#getMethodParameters() // 获取处理方法的参数数组
HandlerMethod#getReturnType() // 获取处理方法的返回值类型

上述2个元数据对象,会在SpringMVC启动的时候初始化好,缓存起来后作为后续请求分发的基础,并且包装到org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 对象中。
通过
RequestMappingHandlerMapping#getHandlerMethods() 即可以获取一个 URL映射描述(RequestMappingInfo)作为Key,具体请求处理的方法(HandlerMethod)的Map对象,每一次的请求,Spring也是通过迭代这个Map,获取到与请求匹配的HandlerMethod来进行处理的,通过这个方法就能获取到所有处理方法的信息。

另外,如果你只是想简单的拿到所有的Controller对象,那么只要获取到指定的Annotation为Controller对象的类即可了。

通过Spring上下文提供的ApplicationContext#getBeanNamesForAnnotation(Controller.class)方法,获取到一个数组包含了Spring容器中,所有标识了Controller注解的Bean的名字。

或者直接通过Application#getBeansWithAnnotation(Controller.class)方法,获取一个Map对象,key为BeanName,value为Bean的实例。

唐代de豆腐
唐代de豆腐
谢谢您了。受教了。
返回顶部
顶部