本文共 4597 字,大约阅读时间需要 15 分钟。
点击蓝色字免费订阅,每天收到这样的好信息
一. objectFactory在spring配置文件中的配置
二.源码分析
先看官方文档中ObjectFactory的含义:
这个对象是mybatis对象实例化用的,本质上内部也是通过构造器来完成的。这个实例对象创建的过程是通过DefaultObjectFactory这类来完成的。但是如果默认的对象工厂无法满足需求,可以定义自己的对象工厂(下面会用实例介绍)。
if (this.objectFactory != null) { configuration.setObjectFactory(this.objectFactory);}
通过configuration.setObjectFactory(this.objectFactory)可以找到加载过程,configuration数据中心对objectFactory就行了配置,
protected ObjectFactory objectFactory = new DefaultObjectFactory();
DefaultObjectFactory就是我们要找的默认对象工厂(不配置的情况下就会使用配置对象工厂)
public class DefaultObjectFactory implements ObjectFactory, Serializable {
这个类实现自接口ObjectFactory。
ObjectFactory接口源码:
public interface ObjectFactory { /** * Sets configuration properties. * @param properties configuration properties */ void setProperties(Properties properties); /** * Creates a new object with default constructor. * @param type Object type * @return */T create(Class type); /** * Creates a new object with the specified constructor and params. * @param type Object type * @param constructorArgTypes Constructor argument types * @param constructorArgs Constructor argument values * @return */ T create(Class type, List > constructorArgTypes, List
实现类DefaultObjectFactory源码:
public class DefaultObjectFactory implements ObjectFactory, Serializable { private static final long serialVersionUID = -8855120656740914948L; @Override publicT create(Class type) { return create(type, null, null); } @SuppressWarnings("unchecked") @Override public T create(Class type, List > constructorArgTypes, List
从上面的create方法代码可以看出classToCreate是要创建的类,这个类是通过resolveInterface获取到的,然后通过instantiateClass利用反射机制创建classToCreate的对象,这样就完成了对象实例化过程。
三. 实例扩展
(配置过程参考第一点)
创建对象工厂,必须继承defaultObjectFactory
代码实现过程:
/** * @author zhaozhiyong * */public class MyObectFactory extends DefaultObjectFactory { @Override public Object create(Class type) { if (type.equals(User.class)){ User u = (User)super.create(type); u.setId(1); u.setName("zhaozhiyong"); u.setAge(1); return u; } return super.create(type); } @Override public void setProperties(Properties properties) { Iterator iterator = properties.keySet().iterator(); while (iterator.hasNext()){ String keyValue = String.valueOf(iterator.next()); System.out.println(properties.getProperty(keyValue)); } super.setProperties(properties); } @Override publicboolean isCollection(Class type) { return super.isCollection(type); }}
单元测试用例代码:
MyObectFactory myObectFactory = new MyObectFactory();User user =(User)myObectFactory.create(User.class);System.out.println("User[id ="+user.getId()+" name="+user.getName()+" age="+user.getSex()+"]");//控制台
Test结果:
通过结果可以看出,自定义的对象工厂已经对user实例化了,所以在DefaultObjectFactory无法满足要求的时候,可以自定义对象工厂完成一些特殊的实例化。
转载地址:http://gdzq.baihongyu.com/