也总是用Spring+HIbernate.但实际上没有去跟代码。
现在我就想知道如何得到Hibernate所有实体对象,但不知道Spring哪个类管理 了。实际看了下是这个类加载的:
LocalSessionFactoryBean,,但跟下去没东西了。
之前也有过一个想法,,想得到Spring3 所有管理的Controller对象。但也是没有找到是哪个类》其实我也没有仔细找。。
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的实例。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。