@TOC
作用:通用注解,标识类为Spring管理的组件
原理:被扫描的类会被注册为Spring容器中的Bean,基于ClassPathBeanDefinitionScanner实现组件扫描
示例:
@Component("myService")
public class MyService {
public void execute() {
System.out.println("Service executed");
}
}作用:自动注入依赖
原理:通过AutowiredAnnotationBeanPostProcessor处理器实现依赖装配
示例:
@Service
public class OrderService {
// 字段注入
@Autowired
private PaymentService paymentService;
// 构造器注入(推荐)
@Autowired
public OrderService(InventoryService inventoryService) {
this.inventoryService = inventoryService;
}
}作用:解决多个相同类型Bean的歧义性问题
原理:与@Autowired配合使用,指定具体的Bean名称
示例:
@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;
}作用:Java配置类代替XML配置
原理:使用CGLIB增强配置类,确保@Bean方法的单例性
示例:
@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);
}
}作用:定义Bean的作用域
原理:通过ScopeMetadataResolver解析作用域信息
示例:
@Component
@Scope("prototype") // 每次请求创建新实例
public class ShoppingCart { }
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION,
proxyMode = ScopedProxyMode.INTERFACES)
public class UserPreferences { } // 会话作用域作用:环境条件化配置
原理:基于Environment中的激活profile加载对应Bean
示例:
@Configuration
@Profile("development")
public class DevDatasourceConfig {
@Bean
public DataSource dataSource() {
// 开发环境数据源
}
}
@Configuration
@Profile("production")
public class ProdDatasourceConfig {
@Bean
public DataSource dataSource() {
// 生产环境数据源
}
}作用:属性注入
原理:通过PropertySourcesPlaceholderConfigurer解析占位符
示例:
@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;
}作用:标记MVC控制器
原理:HandlerMapping检测并映射请求
@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";
}
}作用:@Controller + @ResponseBody的组合
@RestController
@RequestMapping("/api/products")
public class ProductApiController {
@GetMapping("/{id}")
public Product getProduct(@PathVariable Long id) {
return repository.findById(id);
}
}类型:
@PostMapping(value = "/create", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Product> createProduct(
@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);
}常用:
@GetMapping("/search")
public List<Product> searchProducts(
@RequestParam(value = "name", defaultValue = "") String name,
@RequestParam("minPrice") double minPrice,
@RequestParam("maxPrice") double maxPrice) {
return repository.findByNameContainingAndPriceBetween(name, minPrice, maxPrice);
}作用:声明式事务管理
原理:基于AOP实现事务拦截,核心类为TransactionInterceptor
@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;
}
}配置要求:
@Configuration
@EnableTransactionManagement // 启用注解驱动的事务管理
public class PersistenceConfig {
@Bean
public PlatformTransactionManager transactionManager(
DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}@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());
}
}@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // 启用AspectJ代理
public class AopConfig {
// 自动扫描@Aspect注解
}组成:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}条件化配置示例:
@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();
}
}// 启用缓存
@EnableCaching
// 启用定时任务
@EnableScheduling
// 启用异步执行
@EnableAsync
// 启用JPA仓库
@EnableJpaRepositories
// 启用实体管理器
@EntityScan("com.example.domain")
public class ApplicationConfig {}@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) {
// 仅在事务提交后执行
}
}@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) {
// 异步发送邮件
}
}创建组合注解:
@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 {}使用:
@Service
public class OrderService {
@BusinessTransaction
public Order processOrder(Order order) {
// 同时具有事务、重试和监控功能
}
}// 优先在类上声明注解
@Service
@Transactional
public class OrderService {
// 避免在方法上重复声明
}@ComponentScan(
basePackages = "com.example",
excludeFilters = @ComponentScan.Filter(
type = FilterType.REGEX,
pattern = ".*Test.*")
)@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Caching(
cacheable = @Cacheable("users"),
put = @CachePut(value = "users", key = "#result.id")
)
public @interface CacheUser {}@Service
public class ServiceA {
private final ServiceB serviceB;
public ServiceA(@Lazy ServiceB serviceB) {
this.serviceB = serviceB;
}
}public void outerMethod() {
innerMethod(); // AOP不会拦截
((MyService) AopContext.currentProxy()).innerMethod(); // 正确方式
}掌握这些核心注解及其原理,能大幅提升Spring应用的开发效率和质量。建议在实际项目中结合Spring Boot使用,实现更为简洁高效的开发模式。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。