Spring 与 MyBatis 内部工具类大全
本文汇总 Spring、MyBatis 内部工具类,包括 Bean 操作、属性访问、类型转换、反射、集合、字符串、资源、AOP、事件、缓存、性能计时、表达式解析(OGNL/SpEL)、SQL 脚本、插件拦截器等,附详细示例和注意事项。
1. Spring 核心工具类
1.1 Bean 与属性操作
BeanUtils
- 实例化、属性浅拷贝
java User user = new User("刘耀文", 25); UserDTO dto = new UserDTO(); BeanUtils.copyProperties(user, dto); User instance = BeanUtils.instantiateClass(User.class);
- 注意事项:浅拷贝,不支持深层对象。
BeanWrapperImpl
- 支持属性访问、嵌套属性、类型转换
java Person p = new Person(); BeanWrapper bw = new BeanWrapperImpl(p); bw.setPropertyValue("name", "测试"); bw.setPropertyValue("address.city", "Shanghai"); bw.setPropertyValue("tags[0]", "dev"); Object age = bw.getPropertyValue("age");
DirectFieldAccessor
- 直接操作字段
java DirectFieldAccessor accessor = new DirectFieldAccessor(p); accessor.setPropertyValue("name", "直接赋值"); System.out.println(accessor.getPropertyValue("name"));
PropertyAccessorFactory
BeanWrapper bw2 = PropertyAccessorFactory.forBeanPropertyAccess(p);
1.2 类型转换与数据绑定
ConversionService
/ DefaultConversionService
DefaultConversionService cs = new DefaultConversionService();
cs.addConverter(String.class, LocalDate.class, LocalDate::parse);
LocalDate ld = cs.convert("2025-08-18", LocalDate.class);
DataBinder
DataBinder binder = new DataBinder(p);
binder.setAutoGrowNestedPaths(true);
binder.bind(new MutablePropertyValues(Map.of(
"name","刘耀文",
"age","25",
"address.city","Shenzhen"
)));
1.3 反射与方法调用
ReflectionUtils
Method m = ReflectionUtils.findMethod(Person.class, "getName");
ReflectionUtils.makeAccessible(m);
Object name = ReflectionUtils.invokeMethod(m, p);
ClassUtils
boolean isPresent = ClassUtils.isPresent("com.example.User", this.getClass().getClassLoader());
String shortName = ClassUtils.getShortName("com.example.User");
MethodInvoker
MethodInvoker invoker = new MethodInvoker();
invoker.setTargetObject(p);
invoker.setTargetMethod("setName");
invoker.setArguments("刘耀文");
invoker.prepare();
invoker.invoke();
1.4 AOP 与代理
AopUtils
boolean isProxy = AopUtils.isAopProxy(proxyBean);
Class<?> targetClass = AopUtils.getTargetClass(proxyBean);
ProxyFactory
ProxyFactory pf = new ProxyFactory(new PersonService());
pf.addAdvice((MethodInterceptor) invocation -> {
System.out.println("Before " + invocation.getMethod());
Object ret = invocation.proceed();
System.out.println("After " + invocation.getMethod());
return ret;
});
PersonService proxy = (PersonService) pf.getProxy();
proxy.doWork();
1.5 字符串与对象工具
StringUtils
String[] arr = StringUtils.commaDelimitedListToStringArray("a,b,c");
String joined = StringUtils.arrayToDelimitedString(arr, "|");
ObjectUtils
Object[] merged = ObjectUtils.addObjectToArray(new String[]{"a"}, "b");
boolean eq = ObjectUtils.nullSafeEquals("abc", new String("abc"));
Assert
Assert.notNull(p, "Person不能为空");
Assert.hasLength(p.getName(), "name不能为空");
OptionalUtils
Optional<String> val = Optional.ofNullable(null);
String result = OptionalUtils.orElse(val,"默认值");
1.6 集合与流
CollectionUtils
boolean empty = CollectionUtils.isEmpty(list);
Map<String,String> map = CollectionUtils.newHashMap(16);
MultiValueMap
MultiValueMap<String,String> multiMap = new LinkedMultiValueMap<>();
multiMap.add("k1","v1");
multiMap.add("k1","v2");
StreamUtils
List<String> list2 = StreamUtils.createStreamFromArray(new String[]{"a","b"})
.map(String::toUpperCase)
.collect(Collectors.toList());
1.7 文件与资源
ResourceUtils
File file = ResourceUtils.getFile("classpath:application.properties");
FileCopyUtils
FileCopyUtils.copy(new File("a.txt"), new File("b.txt"));
PathMatchingResourcePatternResolver
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath*:com/example/**/*.class");
1.8 性能计时
StopWatch
/ StopWatchTaskInfo
StopWatch sw = new StopWatch("DemoTask");
sw.start("task1");
Thread.sleep(50);
sw.stop();
sw.start("task2");
Thread.sleep(30);
sw.stop();
for(StopWatchTaskInfo info : sw.getTaskInfo()){
System.out.println(info.getTaskName()+" : "+info.getTimeMillis()+"ms");
}
System.out.println(sw.prettyPrint());
1.9 注解与校验
AnnotationUtils
/ MergedAnnotations
boolean has = AnnotatedElementUtils.hasAnnotation(MyController.class, MyMeta.class);
Map<String,Object> attrs = AnnotatedElementUtils.getMergedAnnotationAttributes(MyController.class, MyMeta.class);
ValidationUtils
BeanPropertyBindingResult result = new BeanPropertyBindingResult(p, "person");
ValidationUtils.invokeValidator(new PersonValidator(), p, result);
1.10 定时与事件
CronSequenceGenerator
CronSequenceGenerator generator = new CronSequenceGenerator("0/5 * * * * ?");
Date next = generator.next(new Date());
ApplicationEventPublisher
applicationEventPublisher.publishEvent(new MyEvent(this,"消息内容"));
1.11 表达式处理
OGNL(MyBatis 动态 SQL)
Map<String, Object> context = Map.of("user", new User("刘耀文", 25));
Object expression = Ognl.parseExpression("user.name");
String name = (String) Ognl.getValue(expression, context);
Ognl.setValue("user.age", context, 26);
Spring EL
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(new User("刘耀文", 25));
String name = parser.parseExpression("name").getValue(context, String.class);
parser.parseExpression("age").setValue(context, 26);
2. MyBatis 核心工具类
2.1 对象与属性
MetaObject
MetaObject meta = SystemMetaObject.forObject(p);
meta.setValue("address.city","Shanghai");
Object city = meta.getValue("address.city");
PropertyTokenizer
PropertyTokenizer pt = new PropertyTokenizer("user.addresses[0].city");
System.out.println(pt.getName());
System.out.println(pt.getIndexedName());
System.out.println(pt.getChildren());
Reflector
/ ReflectorFactory
Reflector r = new Reflector(Person.class);
String[] props = r.getGetablePropertyNames();
Class<?> type = r.getGetterType("name");
ObjectFactory
ObjectFactory factory = new DefaultObjectFactory();
User u = factory.create(User.class);
2.2 类型处理
TypeHandler
TypeHandler<String> handler = new StringTypeHandler();
PreparedStatement ps = ...
handler.setParameter(ps,1,"hello",JdbcType.VARCHAR);
String val = handler.getResult(rs,"col");
TypeAliasRegistry
TypeAliasRegistry registry = new TypeAliasRegistry();
registry.registerAlias("user", User.class);
Class<?> clazz = registry.resolveAlias("user");
2.3 资源与 SQL 脚本
Resources
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
ScriptRunner
ScriptRunner runner = new ScriptRunner(connection);
runner.runScript(Resources.getResourceAsReader("init.sql"));
2.4 缓存与插件
缓存装饰器
Cache base = new PerpetualCache("cache1");
Cache decorated = new SynchronizedCache(new LoggingCache(new LruCache(base)));
decorated.putObject("k1","v1");
Object v = decorated.getObject("k1");
插件拦截器
@Intercepts(@Signature(type=StatementHandler.class, method="prepare", args={Connection.class,Integer.class}))
public class TenantInterceptor implements Interceptor {
@Override
public Object intercept(Invocation inv) throws Throwable {
StatementHandler sh = (StatementHandler) inv.getTarget();
MetaObject mo = SystemMetaObject.forObject(sh);
BoundSql bs = (BoundSql) mo.getValue("delegate.boundSql");
String sql = bs.getSql() + " AND tenant_id = ?";
return inv.proceed();
}
}
2.5 工具与集合
CollectionUtils
/ StringUtil
boolean empty = CollectionUtils.isEmpty(list);
boolean notEmpty = StringUtil.isNotEmpty("abc");
MetaClass
MetaClass metaClass = MetaClass.forClass(Person.class, new DefaultReflectorFactory());
boolean hasProp = metaClass.hasGetter("name");
3. 总结与建议
- Spring 工具重点:BeanWrapperImpl、StopWatch、ReflectionUtils、ClassUtils、Assert、OptionalUtils、ConversionService、DataBinder、AnnotationUtils、PathMatchingResourcePatternResolver、CronSequenceGenerator、CacheManager、SpEL。
- MyBatis 工具重点:MetaObject、Reflector、ObjectFactory、TypeHandler、TypeAliasRegistry、Resources、ScriptRunner、MetaClass、缓存装饰器、插件拦截器、OGNL。