BeanUtils

第五章 spring-connet之Imports注解来龙去脉

会有一股神秘感。 提交于 2019-12-07 17:40:06
前言 imports是一个在spring体系里非常重要的注解,基本每个Enable开头的注解必然有一个import注解。接下来我们深入研究下import的作用。看小节的同学建议先取看 PostProcessorRegistrationDelegate与BeanFactoryPostProcessor体系 和 AnnotationConfigUtils PS: 可以先看这个博客了解下 Spring Import 三种用法与源码解读 解析 ConfigurationClassParser的processImports方法是最核心的方法 // 这里是从SourceClass获得imports注解,注意jdk8允许标记多个注解,一个class可以标记多个不同注解,其他注解上也可以标记imports注解,所以需要一个set存放 private Set<SourceClass> getImports(SourceClass sourceClass) throws IOException { Set<SourceClass> imports = new LinkedHashSet<>(); Set<SourceClass> visited = new LinkedHashSet<>(); collectImports(sourceClass, imports, visited); return

common-beanutils包下反射获取bean属性值

ε祈祈猫儿з 提交于 2019-12-06 15:04:07
最近在封装一个数据访问框架的时候,用到了很多反射获取实体值的方法。 最开始采用的是 BeanUtils. describe(bean) ,但在插入数据库的经常报数据类型错误的异常。看了下源码, BeanUtils调用的是BeanUtilsBean的这个getNestedProperty方法,该方法在读取值之后,会再调用一次(getConvertUtils().convert(value));,进行类型转化成String。 因此BeanUtils.describe转化出来的Map的value都是String 。 经过查阅,可以采用 PropertyUtils类,调用 PropertyUtils.describe(bean)方法。 这两个方法,基本上实现原理类似,内部代码很多都相同的,但在读取bean的某个属性的时候都是调用的某个类的getNestedProperty(bean, name)方法。 其实主要的区别就在这个方法中, PropertyUtils是调用的PropertyUtilsBean的这个方法,该方法读取属性值(调用getXxx方法)之后,value不做转化 。 来源: oschina 链接: https://my.oschina.net/u/220491/blog/174970

Apache-Commons-BeanUtils

[亡魂溺海] 提交于 2019-12-06 15:03:35
Commons-BeanUtils 基于Java 反射来完成对Bean的一些操作。常用于对于JavaBean进行各种操作,克隆对象,属性等等。比较简单。 ###包介绍~~~~ org.apache.commons.beanutils – 核心包,定义一组Utils类和需要用到的接口规范 org.apache.commons.beanutils.converters – 转换String到需要类型的类,实现Converter接口 org.apache.commons.beanutils.locale – beanutils的locale敏感版本 org.apache.commons.beanutils.locale.converters – converters的locale敏感版本 org.apache.commons.collections – beanutils使用到的Collection类 ###API分类 复制一个JavaBean的实例-- BeanUtils.cloneBean() 在一个JavaBean的两个实例之间复制属性-- BeanUtils.copyProperties() BeanUtils.copyProperty() 为一个JavaBean的实例设置成员变量(属性)值-- BeanUtils.populate() BeanUtils.setProperty

关于BeanUtils.copyProperties的用法和优缺点

夙愿已清 提交于 2019-12-05 21:02:18
一、简介:   BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。 二、用法:   BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下: Java代码 public static void copyProperties(java.lang.Object dest,java.lang.Object orig) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException   如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值: //得到TeacherForm TeacherForm teacherForm=(TeacherForm)form; /

DDD(十)--仓储

末鹿安然 提交于 2019-12-05 07:30:56
1、引言 DDD中的Repository(仓储):协调领域和数据映射层,利用类似与集合的接口来访问领域对象。——《领域驱动设计-软件核心复杂性应对之道》 仓储是DDD中产生的概念,也就是说,如果应用程序不是基于领域驱动设计的,那在设计中使用仓储是不是会有不合适的地方呢? Eric Evans 在《领域驱动设计-软件核心复杂性应对之道》定义中明确的那样:协调领域和数据映射层,两个关键字领域和数据映射层,这里面的领域是指领域模型(实体和值对象),这是桥的一头,另一头就是数据映射层,也就是我们常说的 ORM 工具。 除了这两个关键词,还有一个动词就是协调,仓储协调的是什么?怎么协调的?这个概念需要明确下,桥的一头-领域模型(主要是实体对象),这个就不多说了,桥的另一头-ORM(对象关系映射),其实仓储协调的是 ORM 中的“O”,也就是对象的概念,它是在数据映射层之上的,是一种概念,而不是一种实现。 2、DDD中的仓储 仓储代表一个聚合的集合,仓储用来存储和删除聚合,但同时提供针对聚合的显式查询以及汇总。 2.1、仓储与数据访问层的区别 仓储限定了只能通过聚合根来持久化和检索领域对象,以确保所有改动和不变性由聚合处理。 仓储通过隐藏聚合持久化和检索的底层技术实现领域层的的持久化无关性(即领域层不需要知道如何持久化领域对象)。 仓储在数据模型和领域模型定义了一个边界。 2.2、仓储举例

《提升能力,涨薪可待》-易理解的@SpringBootApplication注解源码解析

僤鯓⒐⒋嵵緔 提交于 2019-12-04 21:01:44
欢迎一起学习 提升能力,涨薪可待 面试知识,工作可待 实战演练,拒绝996 如果此文对你有帮助、喜欢的话,那就点个赞呗! 前言 是不是感觉在工作上难于晋升了呢? 是不是感觉找工作面试是那么难呢? 是不是感觉自己每天都在996加班呢? 在工作上必须保持学习的能力,这样才能在工作得到更好的晋升,涨薪指日可待,欢迎一起学习【 提升能力,涨薪可待 】系列 在找工作面试应在学习的基础进行总结面试知识点,工作也指日可待,欢迎一起学习【 面试知识,工作可待 】系列 最后,理论知识到准备充足,是不是该躬行起来呢?欢迎一起学习【 实战演练,拒绝996 】系列 springApplication 一、 @SpringBootApplication 的作用是什么? ​ Q:springboot项目的启动类上,都会有个注解 @SpringBootApplication ,这个注解起到了什么作用? @SpringBootApplication public class MicroServiceApplication { public static void main(String[] args) { SpringApplication.run(MicroServiceApplication.class, args); } } ​ 我们进入 @SpringBootApplication 注解,发现它

[springboot 开发单体web shop] 5. 用户登录及首页展示

荒凉一梦 提交于 2019-12-04 06:46:05
用户登录及前端展示 用户登录 在之前的文章中我们实现了用户注册和验证功能,接下来我们继续实现它的登录,以及登录成功之后要在页面上显示的信息。 接下来,我们来编写代码。 实现service 在 com.liferunner.service.IUserService 接口中添加用户登录方法: public interface IUserService { ... /** * 用户登录 * @param userRequestDTO 请求dto * @return 登录用户信息 * @throws Exception */ Users userLogin(UserRequestDTO userRequestDTO) throws Exception; } 然后,在 com.liferunner.service.impl.UserServiceImpl 实现类中实现: @Service @Slf4j public class UserServiceImpl implements IUserService { ... @Override public Users userLogin(UserRequestDTO userRequestDTO) throws Exception { log.info("======用户登录请求:{}", userRequestDTO); Example

浅谈BeanUtils的拷贝,深度克隆

社会主义新天地 提交于 2019-12-03 21:49:51
1、BeanUtil本地简单测试 在项目中由于需要对某些对象进行深度拷贝然后进行持久化操作,想到了apache和spring都提供了BeanUtils的深度拷贝工具包,自己写了几个Demo做测试,定义了两个类User和Person,其中User的属性引用了Person类。 public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 private Person person; //包装类 //get set方法此处省略 } //Person类 public class Person { private int id; private String userName ; private int age ; private String mobilePhone ; public Person(){} public Person(int id,String userName, int age, String mobilePhone) { this.id = id; this.userName = userName; this.age = age;

Java之两个不同对象的List copy相同的属性

大城市里の小女人 提交于 2019-12-03 00:27:36
业务中遇到,使用Mybatis generator生成的Example和Mapper从数据库查询结果,该结果使用的实体类是和数据库字段一一对应的,但是不想把该实体类的所有属性都返回给前端,于是新建一个实体类,其中只有前端需要的属性,然后想把List<UserA>中的对象全部拷贝到List<UserB>中,其中UserA属性多,UserB属性少,字段名是一样的。 方法1:使用Spring的BeanUtils.copyProperties()或者PropertyUtils.copyProperties() 将List1循环,将UserA中需要的属性Set到UserB中。这个方法略麻烦,因为还需要循环,并且创建新对象。 方法2:借助FastJson的Json和对象转换的功能 具体实现就是,将对象(或者List)转换为json,然后再将json信息转换为指定的对象(或者指定对象的List),具体代码贴在下面: /** * 从List<A> copy到List<B> * * @param list * @param clazz * @param <T> * @return */ public static <T> List<T> copy(List<?> list, Class<T> clazz) { String oldOb = JSON.toJSONString(list);

对Java中浅拷贝与深拷贝的理解

雨燕双飞 提交于 2019-11-29 08:14:36
在项目中看到前人写的代码用到了 spring 框架的 BeanUtils.copyProperties 方法,想了解一下这个方法是深拷贝还是浅拷贝,其实这个方法内部对于基本数据类型实现了深拷贝,但对于引用类型还是浅拷贝的。 一、什么是浅拷贝和深拷贝 在 Java 中,除了 基本数据类型 (元类型)之外,还存在 类的实例对象 这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候。对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。 而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。 因此,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不同操作而已。 总结来说: 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。 二、实现深拷贝的方法 浅拷贝和深拷贝其实是相对的: 如果一个对象内部 只有基本数据类型