# Java框架问题

# 问题一:Spring框架常见问题

# 问题描述

  • 循环依赖导致应用启动失败
  • 事务管理失效
  • Bean注入失败
  • AOP切面失效

# 解决方案

  1. 处理循环依赖
// 使用@Lazy注解延迟加载
@Service
public class ServiceA {
    private final ServiceB serviceB;

    public ServiceA(@Lazy ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}

// 使用setter注入
@Service
public class ServiceA {
    private ServiceB serviceB;

    @Autowired
    public void setServiceB(ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}
  1. 修复事务问题
// 正确的事务使用方式
@Service
public class UserService {
    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user) {
        // 业务逻辑
    }

    // 避免同类内部调用
    @Autowired
    private UserService self;

    public void businessMethod() {
        self.updateUser(user); // 使用代理对象调用
    }
}
  1. 正确的Bean注入
// 使用构造器注入
@Service
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

// 使用@Qualifier指定Bean
@Service
public class UserService {
    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource dataSource;
}
  1. 最佳实践
  • 优先使用构造器注入
  • 合理使用AOP切面
  • 正确配置事务属性
  • 避免同类内部调用事务方法

# 问题二:MyBatis框架问题

# 问题描述

  • SQL语句编写错误
  • 参数映射失败
  • 缓存配置不当
  • 连接池设置不合理

# 解决方案

  1. SQL优化
<!-- 使用动态SQL -->
<select id="findUsers" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
    ORDER BY id DESC
</select>
  1. 参数处理
// 使用@Param注解
@Select("SELECT * FROM user WHERE id = #{id} AND name = #{name}")
User findUser(@Param("id") Long id, @Param("name") String name);

// 使用Map传参
@Select("SELECT * FROM user WHERE id = #{id}")
User findUser(Map<String, Object> params);
  1. 缓存配置
<!-- 开启二级缓存 -->
<cache
    eviction="LRU"
    flushInterval="60000"
    size="512"
    readOnly="true"/>

<!-- 使用自定义缓存 -->
<cache type="com.example.MyCacheImplementation">
    <property name="timeout" value="60"/>
</cache>
  1. 最佳实践
  • 使用动态SQL处理复杂查询
  • 合理配置缓存策略
  • 优化连接池参数
  • 使用批量操作提高性能