返回多个值的两个bean结构定义

本文介绍了一种在方法中返回两个或多个值的方法,通过定义特定的Bean结构实现。这种结构使得在处理多值返回的情景下更加便捷。

有时候方法要返回两个值,后者多个值,用下面定义的bean结构可以很快的构建出来:

package com.clou.douliu.server.bean;

import java.io.Serializable;

/**
 * 值对
 * 方法需要返回两个值时,可使用Pair减少代码量
 * @author rabbit
 *
 * @param <F>
 * @param <S>
 */
public final class Pair<F, S> implements Serializable
{
	private static final long serialVersionUID = 1L;
	public F	first;
	public S	second;
	
	public Pair(F f, S s)
	{
		this.first = f;
		this.second = s;
	}
	
	/**
	 * 通过值创建值对
	 * @param <FT>
	 * @param <ST>
	 * @param f
	 * @param s
	 * @return
	 */
	public static <FT, ST> Pair<FT, ST> makePair(FT f, ST s)
	{
		return new Pair<FT, ST>(f, s);
	}
	
	private static <T> boolean eq(T o1, T o2)
	{
		return o1 == null ? o2 == null : o1.equals(o2);
	}
	
	@SuppressWarnings("unchecked")
	public boolean equals(Object o)
	{
		Pair<F, S> pr = (Pair<F, S>) o;
		if(pr == null)
			return false;
		return eq(first, pr.first)
				&& eq(second, pr.second);
	}
	
	private int h(Object o)
	{
		return o == null ? 0 : o.hashCode();
	}
	
	public int hashCode()
	{
		int seed = h(first);
		seed ^= h(second) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
		return seed;
	}
	
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("first=").append(first).append(".\t").append("second=").append(second);
		return sb.toString();
	}
	
}

返回三个值:
package com.clou.douliu.server.bean;

import java.io.Serializable;

/**
 * 三值
 * 方法需要返回三个值时,可使用Triple减少代码量
 * @author denghuahui
 *
 * @param <F>
 * @param <S>
 * @param <T>
 */
public final class Triple<F, S , T> implements Serializable
{
	private static final long serialVersionUID = 1L;
	public F first;
	public S second;
	public T third;
	
	public Triple(F f, S s ,T t)
	{
		this.first = f;
		this.second = s;
		this.third = t;
	}
	
	/**
	 * 通过值创建值对
	 * @param <FT>
	 * @param <ST>
	 * @param f
	 * @param s
	 * @return
	 */
	public static <FT, ST ,TT> Triple<FT, ST , TT> makeTriple(FT f, ST s ,TT t)
	{
		return new Triple<FT, ST ,TT >(f, s ,t);
	}
	
	
	@SuppressWarnings("unchecked")
	public boolean equals(Object o)
	{
		Triple<F, S ,T> pr = (Triple<F, S ,T>) o;
		if(pr == null)
			return false;
		return eq(first, pr.first)
				&& eq(second, pr.second) && eq(third , pr.third);
	}
	
	private int h(Object o)
	{
		return o == null ? 0 : o.hashCode();
	}
	
	public int hashCode()
	{
		int seed = h(first);
		seed ^= h(second) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
		seed ^= h(third) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
		return seed;
	}
	
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("first=").append(first).append(".\t").append("second=").append(second).append(".\t").append("third=").append(third);
		return sb.toString();
	}
	
}
在 MyBatis-Plus 中,多个拦截器 Bean 的配置是可以同时生效的,但需要注意拦截器的添加顺序和配置方式,因为这些因素会影响拦截器的实际执行效果。MyBatis-Plus 使用 `MybatisPlusInterceptor` 来管理多个拦截器,并通过 `addInnerInterceptor` 方法将多个拦截器添加到拦截器链中。只要正确配置,多个拦截器可以协同工作[^2]。 ### 配置方式 在 Spring Boot 项目中,通常通过 `@Configuration` 类来定义拦截器 Bean。例如: ```java @Configuration public class MybatisPlusConfig { private final StringRedisTemplate redisTemplate; public MybatisPlusConfig(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MARIADB); paginationInnerInterceptor.setMaxLimit(500L); interceptor.addInnerInterceptor(getQueryInterceptor()); interceptor.addInnerInterceptor(paginationInnerInterceptor); return interceptor; } @Bean public QueryInterceptor getQueryInterceptor() { return new QueryInterceptor(redisTemplate); } } ``` 在上述代码中,`MybatisPlusInterceptor` 实例通过 `addInnerInterceptor` 方法添加了两个不同的拦截器:`QueryInterceptor` 和 `PaginationInnerInterceptor`。这两个拦截器会按照添加顺序依次执行[^2]。 ### 拦截器执行顺序 拦截器的执行顺序与其添加顺序密切相关。通常情况下,**分页拦截器应尽量放在最后添加**,因为分页逻辑通常需要对 SQL 进行修改,例如添加 `LIMIT` 子句。如果分页拦截器被提前执行,可能会导致其他拦截器无法正常工作,例如统计查询语句无法正确过滤[^2]。 ### 注意事项 1. **依赖注入问题**:如果拦截器依赖于 Spring 容器中的其他 Bean(例如 `StringRedisTemplate`),需要确保拦截器能够正确注入这些依赖。可以通过构造函数注入或 `@Autowired` 注解实现依赖注入[^2]。 2. **拦截器冲突**:不同拦截器之间可能存在冲突,例如多个拦截器同时修改 SQL 语句,可能会导致 SQL 语法错误。因此,需要仔细设计拦截器的逻辑,确保其不会互相干扰。 3. **性能影响**:过多的拦截器可能会对性能产生一定影响,尤其是在处理复杂 SQL 语句时。因此,建议仅添加必要的拦截器,并优化其逻辑。 ### 结论 只要合理配置,多个 MyBatis-Plus 拦截器 Bean 是可以同时生效的。关键在于: - 正确使用 `MybatisPlusInterceptor` 的 `addInnerInterceptor` 方法添加多个拦截器。 - 确保拦截器的执行顺序合理,尤其是分页拦截器应尽量放在最后添加。 - 处理好拦截器与 Spring 容器中其他 Bean 的依赖关系。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值