# Java框架问题
# 问题一:Spring框架常见问题
# 问题描述
- 循环依赖导致应用启动失败
- 事务管理失效
- Bean注入失败
- AOP切面失效
# 解决方案
- 处理循环依赖
// 使用@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;
}
}
- 修复事务问题
// 正确的事务使用方式
@Service
public class UserService {
@Transactional(rollbackFor = Exception.class)
public void updateUser(User user) {
// 业务逻辑
}
// 避免同类内部调用
@Autowired
private UserService self;
public void businessMethod() {
self.updateUser(user); // 使用代理对象调用
}
}
- 正确的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;
}
- 最佳实践
- 优先使用构造器注入
- 合理使用AOP切面
- 正确配置事务属性
- 避免同类内部调用事务方法
# 问题二:MyBatis框架问题
# 问题描述
- SQL语句编写错误
- 参数映射失败
- 缓存配置不当
- 连接池设置不合理
# 解决方案
- 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>
- 参数处理
// 使用@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);
- 缓存配置
<!-- 开启二级缓存 -->
<cache
eviction="LRU"
flushInterval="60000"
size="512"
readOnly="true"/>
<!-- 使用自定义缓存 -->
<cache type="com.example.MyCacheImplementation">
<property name="timeout" value="60"/>
</cache>
- 最佳实践
- 使用动态SQL处理复杂查询
- 合理配置缓存策略
- 优化连接池参数
- 使用批量操作提高性能