@TOC
一、核心容器注解1. @Component作用:通用注解,标识类为Spring管理的组件
原理:被扫描的类会被注册为Spring容器中的Bean,基于ClassPathBeanDefinitionScanner实现组件扫描
示例:
代码语言:java复制@Component("myService")
public class MyService {
public void execute() {
System.out.println("Service executed");
}
}2. @Autowired作用:自动注入依赖
原理:通过AutowiredAnnotationBeanPostProcessor处理器实现依赖装配
示例:
代码语言:java复制@Service
public class OrderService {
// 字段注入
@Autowired
private PaymentService paymentService;
// 构造器注入(推荐)
@Autowired
public OrderService(InventoryService inventoryService) {
this.inventoryService = inventoryService;
}
}3. @Qualifier作用:解决多个相同类型Bean的歧义性问题
原理:与@Autowired配合使用,指定具体的Bean名称
示例:
代码语言:java复制@Repository("jdbcUserDao")
public class JdbcUserDao implements UserDao { }
@Repository("jpaUserDao")
public class JpaUserDao implements UserDao { }
@Service
public class UserService {
@Autowired
@Qualifier("jpaUserDao") // 明确指定JPA实现
private UserDao userDao;
}4. @Configuration 和 @Bean作用:Java配置类代替XML配置
原理:使用CGLIB增强配置类,确保@Bean方法的单例性
示例:
代码语言:java复制@Configuration
public class AppConfig {
@Bean(name = "dataSource")
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
return ds;
}
@Bean
public PlatformTransactionManager transactionManager(
@Autowired DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}5. @Scope作用:定义Bean的作用域
原理:通过ScopeMetadataResolver解析作用域信息
示例:
代码语言:java复制@Component
@Scope("prototype") // 每次请求创建新实例
public class ShoppingCart { }
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION,
proxyMode = ScopedProxyMode.INTERFACES)
public class UserPreferences { } // 会话作用域6. @Profile作用:环境条件化配置
原理:基于Environment中的激活profile加载对应Bean
示例:
代码语言:java复制@Configuration
@Profile("development")
public class DevDatasourceConfig {
@Bean
public DataSource dataSource() {
// 开发环境数据源
}
}
@Configuration
@Profile("production")
public class ProdDatasourceConfig {
@Bean
public DataSource dataSource() {
// 生产环境数据源
}
}7. @Value作用:属性注入
原理:通过PropertySourcesPlaceholderConfigurer解析占位符
示例:
代码语言:java复制@Service
public class EmailService {
@Value("${email.smtp.host}")
private String smtpHost;
@Value("${email.smtp.port:587}")
private int smtpPort;
@Value("#{systemProperties['user.name']}")
private String systemUser;
}二、Spring MVC注解1. @Controller作用:标记MVC控制器
原理:HandlerMapping检测并映射请求
代码语言:java复制@Controller
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductRepository repository;
@GetMapping("/{id}")
public String getProduct(@PathVariable Long id, Model model) {
model.addAttribute("product", repository.findById(id));
return "product-detail";
}
}2. @RestController作用:@Controller + @ResponseBody的组合
代码语言:java复制@RestController
@RequestMapping("/api/products")
public class ProductApiController {
@GetMapping("/{id}")
public Product getProduct(@PathVariable Long id) {
return repository.findById(id);
}
}3. 请求映射注解类型:
@RequestMapping@GetMapping@PostMapping@PutMapping@PatchMapping@DeleteMapping代码语言:java复制@PostMapping(value = "/create", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity
@RequestBody Product product,
UriComponentsBuilder builder) {
Product saved = repository.save(product);
URI location = builder.path("/products/{id}")
.buildAndExpand(saved.getId()).toUri();
return ResponseEntity.created(location).body(saved);
}4. 参数绑定注解常用:
@PathVariable:获取URL中的模板变量@RequestParam:获取请求参数@RequestBody:获取请求体内容@RequestHeader:获取请求头@CookieValue:获取Cookie值代码语言:java复制@GetMapping("/search")
public List
@RequestParam(value = "name", defaultValue = "") String name,
@RequestParam("minPrice") double minPrice,
@RequestParam("maxPrice") double maxPrice) {
return repository.findByNameContainingAndPriceBetween(name, minPrice, maxPrice);
}三、事务管理@Transactional作用:声明式事务管理
原理:基于AOP实现事务拦截,核心类为TransactionInterceptor
代码语言:java复制@Service
public class OrderService {
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
timeout = 30,
rollbackFor = {PaymentException.class, InventoryException.class}
)
public Order createOrder(OrderRequest request) {
// 多个数据库操作组成事务
reduceInventory(request);
createPaymentRecord(request);
createOrderRecord(request);
return order;
}
}配置要求:
代码语言:java复制@Configuration
@EnableTransactionManagement // 启用注解驱动的事务管理
public class PersistenceConfig {
@Bean
public PlatformTransactionManager transactionManager(
DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}四、AOP编程1. 切面声明代码语言:java复制@Aspect
@Component
public class LoggingAspect {
// 定义切点(使用AspectJ表达式)
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}
// Around通知:环绕目标方法
@Around("serviceLayer()")
public Object logExecutionTime(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed(); // 执行目标方法
long duration = System.currentTimeMillis() - start;
System.out.println(pjp.getSignature() + " executed in " + duration + "ms");
return result;
}
// AfterThrowing通知:异常处理
@AfterThrowing(pointcut = "serviceLayer()", throwing = "ex")
public void logException(JoinPoint jp, Exception ex) {
System.err.println("Exception in " + jp.getSignature() + ": " + ex.getMessage());
}
}2. 启用AOP代码语言:java复制@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // 启用AspectJ代理
public class AopConfig {
// 自动扫描@Aspect注解
}五、Spring Boot扩展注解1. @SpringBootApplication组成:
@SpringBootConfiguration:继承自@Configuration@EnableAutoConfiguration:启用自动配置@ComponentScan:组件扫描代码语言:java复制@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}2. @Conditional 家族条件化配置示例:
代码语言:java复制@Configuration
public class FeatureConfig {
// 仅当某个类在类路径中存在时创建Bean
@Bean
@ConditionalOnClass(name = "com.example.SpecialService")
public FeatureService featureService() {
return new FeatureServiceImpl();
}
// 仅当某个属性为true时创建Bean
@Bean
@ConditionalOnProperty(name = "features.analytics", havingValue = "true")
public AnalyticsService analyticsService() {
return new GoogleAnalytics();
}
}3. @Enable* 系列代码语言:java复制// 启用缓存
@EnableCaching
// 启用定时任务
@EnableScheduling
// 启用异步执行
@EnableAsync
// 启用JPA仓库
@EnableJpaRepositories
// 启用实体管理器
@EntityScan("com.example.domain")
public class ApplicationConfig {}六、高级功能注解1. 事件监听代码语言:java复制@Component
public class OrderEventListener {
// 监听OrderCreatedEvent事件
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
System.out.println("Processing order: " + event.getOrder());
}
// 事务监听器
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleAfterCommit(OrderCreatedEvent event) {
// 仅在事务提交后执行
}
}2. 异步处理代码语言:java复制@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.initialize();
return executor;
}
}
@Service
public class NotificationService {
@Async
public void sendEmail(String to, String content) {
// 异步发送邮件
}
}3. 自定义注解创建组合注解:
代码语言:java复制@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 多个注解的组合
@Transactional(rollbackFor = Exception.class)
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 2000))
@MetricTime("serviceLayer")
public @interface BusinessTransaction {}使用:
代码语言:java复制@Service
public class OrderService {
@BusinessTransaction
public Order processOrder(Order order) {
// 同时具有事务、重试和监控功能
}
}七、注解原理深度解析注解处理机制组件扫描:ClassPathScanningCandidateComponentProvider扫描类路径使用AnnotationTypeFilter检测标记注解注册BeanDefinition依赖注入:AutowiredAnnotationBeanPostProcessor处理注入解析字段、方法和构造器上的注解解决依赖并注入值AOP代理:创建代理对象(JDK动态代理或CGLIB)AnnotationAwareAspectJAutoProxyCreator管理切面事务管理:创建事务代理事务拦截器处理事务边界PlatformTransactionManager管理实际事务性能优化技巧注解层级优化:代码语言:java复制// 优先在类上声明注解
@Service
@Transactional
public class OrderService {
// 避免在方法上重复声明
}组件扫描优化:代码语言:java复制@ComponentScan(
basePackages = "com.example",
excludeFilters = @ComponentScan.Filter(
type = FilterType.REGEX,
pattern = ".*Test.*")
)缓存注解配置:代码语言:java复制@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Caching(
cacheable = @Cacheable("users"),
put = @CachePut(value = "users", key = "#result.id")
)
public @interface CacheUser {}常见问题解决循环依赖问题:使用setter注入代替构造器注入添加@Lazy注解延迟初始化代码语言:java复制@Service
public class ServiceA {
private final ServiceB serviceB;
public ServiceA(@Lazy ServiceB serviceB) {
this.serviceB = serviceB;
}
}事务失效场景:确保异常类型正确配置:rollbackFor = Exception.class避免同一个类中非公开方法调用使用@EnableTransactionManagement(proxyTargetClass=true)AOP拦截限制:使用@EnableAspectJAutoProxy(exposeProxy = true)暴露代理在内部方法调用时使用 AopContext.currentProxy()代码语言:java复制public void outerMethod() {
innerMethod(); // AOP不会拦截
((MyService) AopContext.currentProxy()).innerMethod(); // 正确方式
}掌握这些核心注解及其原理,能大幅提升Spring应用的开发效率和质量。建议在实际项目中结合Spring Boot使用,实现更为简洁高效的开发模式。