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. 洛谷 P1176 路径计数2

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了, ...

  2. SpringMVC拓展

    ### 原生SpringMVC有如下缺陷 参数的JSON反序列化只支持@RequestBody注解,这意味着不能在controller方法中写多个参数,如下代码是不对的 public Map test ...

  3. C/C++里面的struct和typedef

    今天看到这样的代码 typedef struct _Abc { uint64_t unit_id; ...... } Abc; 开始不理解这个的意思,后来看到这个解释: https://stackov ...

  4. Spring可扩展Schema标签

    基于Spring可扩展Schema提供自己定义配置支持 http://blog.csdn.net/cutesource/article/details/5864562 WARN : org.sprin ...

  5. 荣耀A55高调上市仅仅为孤独求败?

        坦白说.华为近年来在手机市场上确实取得了一些成绩.比方之前P6的出现就凭借超薄的设计.突出的性价比让大家看到了国产手机的新希望.按理说.在手机市场上尝到甜头的华为应该继续坚持低价.亲民的路线, ...

  6. nodeJs学习路线

    转载自:http://blog.fens.me/nodejs-roadmap/ 前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个. 和全部人一样,我也从 ...

  7. Xcode加入应用图标以及启动界面

    寻找了许久的资料,记录下Xcode加入应用图标以及启动界面的学习笔记: 很实用的网址: 1.(苹果官网)Designing for iOS 2.iOS 8 人机交互指南 图标和图片的尺寸參考: 更加具 ...

  8. nginx 11个过程

    nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系,详细内容可以阅读<深入理解nginx:模块开发与架构解析>这本书,这里只做简单介绍: 1. ...

  9. 冒泡排序算法 C#版

    冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所 ...

  10. Firefox 浏览器添加Linux jre插件

    在安装 Java 平台时,Java 插件文件将作为该安装的一部分包含在内.要在 Firefox 中使用 Java,您需要从该发行版中的插件文件手动创建符号链接指向 Firefox 预期的其中一个位置. ...