1.

 package com.glodon.gspm.adapter.plugin.common;

 import com.glodon.cloudt.tenancy.context.TenantContext;
import org.bson.Document;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.util.StringUtils; import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
* 实体对象转Document类
* Created by hezg on 2017/4/4.
*/
public class Bean2Document<T> { //字段前缀
private static final char COLUMN_PREFIX = 'F';
//单词分隔符
private static final char UNDER_LINE = '_';
//字段属性映射
private transient Map<String, PropertyDescriptor> mappedFields; private static Map<Class<?>, Bean2Document> mapperMap = new ConcurrentHashMap<>(); public Bean2Document(Class<T> mappedClass) {
initialize(mappedClass);
} /**
* 创建一个新的Bean2Document类
*
* @param mappedClass 需要映射的实体类
*/
@SuppressWarnings("unchecked")
public static <T> Bean2Document<T> newInstance(Class<T> mappedClass) {
Bean2Document mapper = mapperMap.get(mappedClass);
if (mapper == null) {
mapper = new Bean2Document<>(mappedClass);
mapperMap.put(mappedClass, mapper);
}
return (Bean2Document<T>) mapper;
} /**
* 将实体属性初始化到mappedFields中
*
* @param mappedClass 需要初始化的实体类
*/
@SuppressWarnings("Duplicates")
protected void initialize(Class<T> mappedClass) {
this.mappedFields = new HashMap<>();
PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass);
for (PropertyDescriptor pd : pds) {
if (pd.getWriteMethod() != null) {
this.mappedFields.put(pd.getName().toUpperCase(), pd);
}
}
} /**
* 将实体字段名转换为表字段名
*
* @param name 实体字段
* @return 返回对应表字段名
*/
@SuppressWarnings("Duplicates")
private String underscoreName(String name) {
if (!StringUtils.hasLength(name)) {
return "";
}
// 添加字段前缀
StringBuilder result = new StringBuilder();
if (!StringUtils.isEmpty(COLUMN_PREFIX)) {
result.append(COLUMN_PREFIX).append(UNDER_LINE);
}
result.append(name.substring(0, 1).toUpperCase());
for (int i = 1; i < name.length(); i++) {
String ss = name.substring(i, i + 1);
String slc = ss.toUpperCase();
if (ss.equals(slc)) {
result.append(UNDER_LINE).append(slc);
} else {
result.append(slc);
}
}
return result.toString();
} /**
* 将实体数据格式转换为Document格式
*
* @param data 实体数据
* @return Document格式数据
*/
public Document toDocument(T data) {
if (data == null) {
return null;
} Document document = new Document();
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(data);
for (PropertyDescriptor pd : this.mappedFields.values()) {
Object value = bw.getPropertyValue(pd.getName());
String underscoredName = underscoreName(pd.getName());
document.put(underscoredName, value);
}
//Mongo同一接口,所有类转Document时都带上租户Id
long tenantId = TenantContext.getCurrent()
.getTenantId(); document.put("F_TENANT_ID", tenantId);
return document;
}
}

11.Bean2Document-BEAN转document的更多相关文章

  1. spring装配Bean过程

    主要流程: 1.读取配置文件 2.实例化bean和填充bean属性 这个粗略的流程感觉更像是一个需求,有了这个需求,那么spring内部是怎么处理的呢? 我们知道spring的两个核心接口BeanFa ...

  2. 11月8日上午Jquery的基础语法、选取元素、操作元素、加事件、挂事件及移除事件

    jquery基础知识 1.jquery文件的引入,所有的js代码要写在下面那段代码下面. <script src="../jquery-1.11.2.min.js">& ...

  3. IOC装配Bean(XML方式)

    Spring框架Bean实例化的方式 提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 无参数构造方法的实例化 <!-- 默认情况下使用的就是 ...

  4. Spring-配置bean的方法(工厂方法和Factorybean)【转】

    通过工厂方法配置bean 通过调用静态工厂方法创建bean 通过静态工厂方法创建bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节. 要声 ...

  5. Spring IOC容器中注入bean

    一.基于schema格式的注入 1.基本的注入方式 (属性注入方式) 根据setXxx()方法进行依赖注入,Spring只会检查是否有setter方法,是否有对应的属性不做要求 <bean id ...

  6. 【Spring】Spring系列2之bean的配置

    2.bean的配置 2.1.IOC概述 2.2.bean的获取 2.3.依赖注入方式 2.4.属性注入细节 内部bean,不需要ID,ID无效,外部不能引用: 2.5.集合属性注入 2.6.使用p命名 ...

  7. Spring 框架 详解 (三)-----IOC装配Bean

    IOC装配Bean: 1.1.1 Spring框架Bean实例化的方式: 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 无参数构造方法 ...

  8. document.referrer之隐藏来源

    document.referrer document.referrer是用来获取跳转链接的来源,正规的解释是:referrer 属性可返回载入当前文档的文档的 URL. 实际中使用在广告相关业务中较多 ...

  9. Bean 的生命周期 之 后处理Bean

    这里先把Bean 的生命周期总结一下,然后引出后处理Bean 首先,Bean 的生命周期总共有11步: 1.instantiate bean对象实例化 2.populate properties 封装 ...

  10. spring Bean的完整生命周期

    spring 容器中的bean的完整生命周期一共分为十一步完成. 1.bean对象的实例化 2.封装属性,也就是设置properties中的属性值 3.如果bean实现了BeanNameAware,则 ...

随机推荐

  1. CodeForces 363B Fence

    Fence Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ...

  2. bzoj 2120 数颜色 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23990489 [原题] 2120: 数颜色 Time Limit: 6 Sec  M ...

  3. ZOJ 2588 Burning Bridges(无向连通图求割边)

    题目地址:ZOJ 2588 由于数组开小了而TLE了..这题就是一个求无向连通图最小割边.仅仅要推断dfn[u]是否<low[v],由于low指的当前所能回到的祖先的最小标号,增加low[v]大 ...

  4. 线程池系列一:线程池作用及Executors方法讲解

    线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量 ...

  5. centos7 nginx搭建及其反向代理

    摘要:nginx反向代理的原理:外部通过ip加端口访问nginx,nginx接收到外部请求,通过ip解析访问内部服务器,内部服务器再将数据传回Nginx服务器,而Nginx再把数据传回给外部客户机. ...

  6. BZOJ 4236 set乱搞

    思路: 取个差 在set里面找 更新 (这个用map更好吧 但是我不会--) //By SiriusRen #include <set> #include <cstdio> # ...

  7. n阶幻方问题

    转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录        第一节 n阶幻方问题       第二节 由n阶幻方引发 ...

  8. AIX 系统补丁格式

    AIX 系统版本标准格式: 5300-06-11-0918 VR00-TL-SP-YYWW     5300-06-11-0918              ^-------- YYWW(2009年第 ...

  9. react-native signatures do not match the previously installed version;

    原因:手机上已经安装过打包后的apk应用,与真机调试无法共存. 解决办法:删除手机上已经安装过的apk应用.

  10. TCP简单说|(上)

    本文在Creative Commons许可证下发布 TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人 ...