소스 정보
- 저장소
- microwind/ai-skills
- 최근 소스 활동
- 2026년 3월 26일 14:58
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 68
- 포크
- 17
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
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; }
}
}