用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/microwind/ai-skills --skill spring命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | Spring框架分析器 |
| description | 当分析Spring框架应用时,检查Bean配置,优化性能,审查安全设置。验证Spring Boot配置,分析依赖注入,和最佳实践。 |
| license | MIT |
Spring框架提供了企业级功能,但错误的配置会导致性能低下、难以维护的代码。需要建立完善的Spring应用分析和优化机制。
核心原则: Spring启用企业功能,但错误配置导致缓慢、不可维护的代码。
始终:
触发短语:
问题:
Bean之间存在循环依赖关系
后果:
- 应用启动失败
- Bean创建异常
- 内存泄漏
- 性能下降
解决方案:
- 重构Bean依赖关系
- 使用@Lazy注解
- 引入接口抽象
- 使用ApplicationContextAware
问题:
Bean作用域配置不当
后果:
- 状态共享问题
- 内存泄漏
- 并发安全问题
- 性能影响
解决方案:
- 正确选择作用域
- 避免Singleton状态
- 使用@Scope注解
- 考虑线程安全
问题:
事务传播行为配置错误
后果:
- 数据不一致
- 事务回滚失败
- 死锁问题
- 性能问题
解决方案:
- 正确配置传播行为
- 设置合适的隔离级别
- 处理异常回滚
- 优化事务边界
懒加载:
- 减少启动时间
- 按需加载Bean
- 避免不必要的依赖
- 提升应用性能
作用域管理:
- 合理使用Singleton
- 谨慎使用Prototype
- 考虑Request作用域
- 避免状态共享
数据库优化:
- 连接池配置
- 批处理操作
- 查询缓存
- N+1问题解决
缓存策略:
- Spring Cache配置
- 多级缓存设计
- 缓存失效策略
- 分布式缓存
package com.example.spring.analyzer;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Repository;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
public class SpringConfigurationAnalyzer {
private final ApplicationContext applicationContext;
private final Map<String, List<String>> issues = new HashMap<>();
private final Map<String, Object> metrics = new HashMap<>();
public SpringConfigurationAnalyzer(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public AnalysisReport analyzeConfiguration() {
AnalysisReport report = new AnalysisReport();
analyzeBeanDefinitions(report);
checkCircularDependencies(report);
analyzeScopes(report);
analyzeAutowired(report);
analyzeTransactionConfiguration(report);
analyzeSecurityConfiguration(report);
analyzePerformance(report);
report;
}
{
String[] beanNames = applicationContext.getBeanDefinitionNames();
Map<String, Integer> annotationCounts = <>();
Map<String, List<String>> beansByAnnotation = <>();
(String beanName : beanNames) {
{
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != ) {
(beanClass.isAnnotationPresent(Component.class)) {
addAnnotation(annotationCounts, beansByAnnotation, , beanName);
}
(beanClass.isAnnotationPresent(Service.class)) {
addAnnotation(annotationCounts, beansByAnnotation, , beanName);
}
(beanClass.isAnnotationPresent(Repository.class)) {
addAnnotation(annotationCounts, beansByAnnotation, , beanName);
}
(beanClass.isAnnotationPresent(Configuration.class)) {
addAnnotation(annotationCounts, beansByAnnotation, , beanName);
}
(beanClass.isAnnotationPresent(RestController.class)) {
addAnnotation(annotationCounts, beansByAnnotation, , beanName);
}
}
} (Exception e) {
report.addIssue(, + beanName + + e.getMessage());
}
}
report.setMetric(, beanNames.length);
report.setMetric(, annotationCounts);
report.setMetric(, beansByAnnotation);
}
{
counts.put(annotation, counts.getOrDefault(annotation, ) + );
grouping.computeIfAbsent(annotation, k -> <>()).add(beanName);
}
{
String[] beanNames = applicationContext.getBeanDefinitionNames();
Map<String, Set<String>> dependencyGraph = <>();
(String beanName : beanNames) {
{
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != ) {
Set<String> dependencies = <>();
(Field field : beanClass.getDeclaredFields()) {
(field.isAnnotationPresent(Autowired.class)) {
dependencies.add(field.getType().getName());
}
}
(Method method : beanClass.getDeclaredMethods()) {
(method.isAnnotationPresent(Autowired.class)) {
(Class<?> paramType : method.getParameterTypes()) {
dependencies.add(paramType.getName());
}
}
}
dependencyGraph.put(beanName, dependencies);
}
} (Exception e) {
report.addIssue(, + beanName + + e.getMessage());
}
}
Set<String> visited = <>();
Set<String> recursionStack = <>();
(String beanName : dependencyGraph.keySet()) {
(!visited.contains(beanName)) {
(hasCircularDependency(beanName, dependencyGraph, visited, recursionStack)) {
report.addIssue(, + beanName);
}
}
}
}
{
visited.add(beanName);
recursionStack.add(beanName);
Set<String> dependencies = dependencyGraph.get(beanName);
(dependencies != ) {
(String dependency : dependencies) {
(!visited.contains(dependency) &&
hasCircularDependency(dependency, dependencyGraph, visited, recursionStack)) {
;
} (recursionStack.contains(dependency)) {
;
}
}
}
recursionStack.remove(beanName);
;
}
{
String[] beanNames = applicationContext.getBeanDefinitionNames();
Map<String, Integer> scopeCounts = <>();
List<String> prototypeBeans = <>();
(String beanName : beanNames) {
{
applicationContext.getBeanFactory().getBeanDefinition(beanName);
beanDefinition.getScope();
scopeCounts.put(scope, scopeCounts.getOrDefault(scope, ) + );
(.equals(scope)) {
prototypeBeans.add(beanName);
}
} (Exception e) {
report.addIssue(, + beanName + + e.getMessage());
}
}
report.setMetric(, scopeCounts);
(String prototypeBean : prototypeBeans) {
{
Class<?> beanClass = applicationContext.getType(prototypeBean);
(beanClass != ) {
hasStatefulFields(beanClass);
(hasState) {
report.addIssue(, + prototypeBean);
}
}
} (Exception e) {
report.addIssue(, + prototypeBean);
}
}
}
{
(Field field : clazz.getDeclaredFields()) {
(!field.getType().isPrimitive() &&
!field.getType().equals(String.class) &&
!field.isAnnotationPresent(Autowired.class)) {
;
}
}
;
}
{
String[] beanNames = applicationContext.getBeanDefinitionNames();
;
;
List<String> constructorInjectionBeans = <>();
(String beanName : beanNames) {
{
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != ) {
;
;
;
(Field field : beanClass.getDeclaredFields()) {
(field.isAnnotationPresent(Autowired.class)) {
hasFieldAutowired = ;
fieldAutowiredCount++;
}
}
(Method method : beanClass.getDeclaredMethods()) {
(method.isAnnotationPresent(Autowired.class)) {
hasMethodAutowired = ;
methodAutowiredCount++;
}
}
(Constructor<?> constructor : beanClass.getConstructors()) {
(constructor.isAnnotationPresent(Autowired.class) ||
constructor.getParameterCount() > ) {
hasConstructorInjection = ;
constructorInjectionBeans.add(beanName);
;
}
}
(hasFieldAutowired && !hasConstructorInjection) {
report.addRecommendation(,
+ beanName);
}
}
} (Exception e) {
report.addIssue(, + beanName + + e.getMessage());
}
}
report.setMetric(, fieldAutowiredCount);
report.setMetric(, methodAutowiredCount);
report.setMetric(, constructorInjectionBeans);
}
{
{
(applicationContext.containsBean()) {
report.setMetric(, );
} {
report.addIssue(, );
}
} (Exception e) {
report.addIssue(, + e.getMessage());
}
String[] beanNames = applicationContext.getBeanDefinitionNames();
;
List<String> transactionalBeans = <>();
(String beanName : beanNames) {
{
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != ) {
;
(Method method : beanClass.getDeclaredMethods()) {
(method.isAnnotationPresent(org.springframework.transaction.annotation.Transactional.class)) {
hasTransactional = ;
transactionalMethodCount++;
}
}
(hasTransactional) {
transactionalBeans.add(beanName);
}
}
} (Exception e) {
report.addIssue(, + beanName + + e.getMessage());
}
}
report.setMetric(, transactionalMethodCount);
report.setMetric(, transactionalBeans);
}
{
{
String[] securityBeans = applicationContext.getBeanNamesForType(
org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.class);
(securityBeans.length > ) {
report.setMetric(, );
} {
report.addRecommendation(, );
}
} (Exception e) {
}
}
{
String[] beanNames = applicationContext.getBeanDefinitionNames();
report.setMetric(, beanNames.length);
(beanNames.length > ) {
report.addIssue(, );
}
;
(String beanName : beanNames) {
{
applicationContext.getBeanFactory().getBeanDefinition(beanName);
(beanDefinition.isLazyInit()) {
lazyBeanCount++;
}
} (Exception e) {
}
}
report.setMetric(, lazyBeanCount);
report.setMetric(, () lazyBeanCount / beanNames.length * );
}
{
Map<String, List<String>> issues = <>();
Map<String, List<String>> recommendations = <>();
Map<String, Object> metrics = <>();
{
issues.computeIfAbsent(category, k -> <>()).add(issue);
}
{
recommendations.computeIfAbsent(category, k -> <>()).add(recommendation);
}
{
metrics.put(name, value);
}
Map<String, List<String>> { issues; }
Map<String, List<String>> { recommendations; }
Map<String, Object> { metrics; }
{
System.out.println();
System.out.println();
metrics.forEach((key, value) -> {
System.out.println(key + + value);
});
System.out.println();
issues.forEach((category, issueList) -> {
System.out.println(category + );
issueList.forEach(issue -> System.out.println( + issue));
});
System.out.println();
recommendations.forEach((category, recList) -> {
System.out.println(category + );
recList.forEach(rec -> System.out.println( + rec));
});
}
}
}
{
ApplicationContext applicationContext;
{
(applicationContext);
SpringConfigurationAnalyzer. analyzer.analyzeConfiguration();
report.printReport();
saveReportToFile(report);
}
{
}
}
package com.example.spring.optimizer;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Configuration
@EnableCaching
@EnableTransactionManagement
public class SpringPerformanceOptimizer {
private final ApplicationContext applicationContext;
private final Map<String, PerformanceMetrics> performanceMetrics = new ConcurrentHashMap<>();
public SpringPerformanceOptimizer(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Bean
@ConditionalOnProperty(name = "spring.performance.monitoring", havingValue = "true")
public PerformanceMonitor performanceMonitor() {
return new PerformanceMonitor(applicationContext);
}
@Bean
@ConditionalOnProperty(name = "spring.performance.optimization", havingValue = "true")
public PerformanceOptimizer performanceOptimizer {
(applicationContext);
}
{
ApplicationContext applicationContext;
{
.applicationContext = applicationContext;
}
Map<String, Object> {
Map<String, Object> metrics = <>();
metrics.put(, measureBeanStartupTime());
metrics.put(, getMemoryUsage());
metrics.put(, getBeanStatistics());
metrics.put(, calculateDependencyComplexity());
metrics;
}
{
System.currentTimeMillis();
applicationContext.getBeanDefinitionNames();
System.currentTimeMillis() - startTime;
}
Map<String, Object> {
Runtime.getRuntime();
Map<String, Object> memory = <>();
memory.put(, runtime.totalMemory());
memory.put(, runtime.freeMemory());
memory.put(, runtime.totalMemory() - runtime.freeMemory());
memory.put(, runtime.maxMemory());
memory;
}
Map<String, Object> {
String[] beanNames = applicationContext.getBeanDefinitionNames();
Map<String, Object> stats = <>();
stats.put(, beanNames.length);
Map<String, Integer> scopeDistribution = <>();
(String beanName : beanNames) {
{
applicationContext.getBeanFactory()
.getBeanDefinition(beanName);
beanDefinition.getScope();
scopeDistribution.put(scope, scopeDistribution.getOrDefault(scope, ) + );
} (Exception e) {
}
}
stats.put(, scopeDistribution);
stats;
}
{
String[] beanNames = applicationContext.getBeanDefinitionNames();
;
(String beanName : beanNames) {
{
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != ) {
;
(Field field : beanClass.getDeclaredFields()) {
(field.isAnnotationPresent(Autowired.class)) {
dependencies++;
}
}
totalDependencies += dependencies;
}
} (Exception e) {
}
}
beanNames.length > ? () totalDependencies / beanNames.length : ;
}
}
{
ApplicationContext applicationContext;
{
.applicationContext = applicationContext;
}
List<OptimizationSuggestion> {
List<OptimizationSuggestion> suggestions = <>();
suggestions.addAll(checkLazyLoadingOptimization());
suggestions.addAll(checkScopeOptimization());
suggestions.addAll(checkDependencyInjectionOptimization());
suggestions.addAll(checkCacheOptimization());
suggestions;
}
List<OptimizationSuggestion> {
List<OptimizationSuggestion> suggestions = <>();
String[] beanNames = applicationContext.getBeanDefinitionNames();
;
List<String> candidatesForLazy = <>();
(String beanName : beanNames) {
{
applicationContext.getBeanFactory()
.getBeanDefinition(beanName);
(!beanDefinition.isLazyInit()) {
eagerBeans++;
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != && isCandidateForLazyLoading(beanClass)) {
candidatesForLazy.add(beanName);
}
}
} (Exception e) {
}
}
(eagerBeans > beanNames.length * ) {
suggestions.add( (
,
,
candidatesForLazy,
));
}
suggestions;
}
{
beanClass.getPackage().getName();
packageName.contains() ||
packageName.contains() ||
packageName.contains() ||
beanClass.isAnnotationPresent(org.springframework.stereotype.Component.class);
}
List<OptimizationSuggestion> {
List<OptimizationSuggestion> suggestions = <>();
String[] beanNames = applicationContext.getBeanDefinitionNames();
(String beanName : beanNames) {
{
applicationContext.getBeanFactory()
.getBeanDefinition(beanName);
(.equals(beanDefinition.getScope())) {
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != && hasStatefulFields(beanClass)) {
suggestions.add( (
,
+ beanName,
Arrays.asList(beanName),
));
}
}
} (Exception e) {
}
}
suggestions;
}
{
(Field field : clazz.getDeclaredFields()) {
(!field.getType().isPrimitive() &&
!field.getType().equals(String.class) &&
!field.isAnnotationPresent(Autowired.class)) {
;
}
}
;
}
List<OptimizationSuggestion> {
List<OptimizationSuggestion> suggestions = <>();
String[] beanNames = applicationContext.getBeanDefinitionNames();
(String beanName : beanNames) {
{
Class<?> beanClass = applicationContext.getType(beanName);
(beanClass != ) {
List<Field> fieldInjected = <>();
(Field field : beanClass.getDeclaredFields()) {
(field.isAnnotationPresent(Autowired.class)) {
fieldInjected.add(field);
}
}
(fieldInjected.size() > ) {
suggestions.add( (
,
+ beanName,
Arrays.asList(beanName),
));
}
}
} (Exception e) {
}
}
suggestions;
}
List<OptimizationSuggestion> {
List<OptimizationSuggestion> suggestions = <>();
{
applicationContext.getBean(org.springframework.cache.CacheManager.class);
} (Exception e) {
suggestions.add( (
,
,
Collections.emptyList(),
));
}
suggestions;
}
}
{
String category;
String description;
List<String> affectedBeans;
String priority;
{
.category = category;
.description = description;
.affectedBeans = affectedBeans;
.priority = priority;
}
String { category; }
String { description; }
List<String> { affectedBeans; }
String { priority; }
}
}