Spring核心:IoC容器掌控对象生命周期
Spring的核心是IoC(控制反转)容器,它负责对象的创建、组装和管理生命周期,彻底解耦组件依赖。
//定义Bean@ComponentpublicclassOrderService{privatefinalPaymentProcessorpaymentProcessor;@Autowired//构造器注入(推荐)publicOrderService(PaymentProcessorpaymentProcessor){this.paymentProcessor=paymentProcessor;}}//配置类(替代传统XML)@Configuration@ComponentScan("com.example.service")publicclassAppConfig{@BeanpublicPaymentProcessorpaymentProcessor(){returnnewCreditCardProcessor();//灵活更换实现}}//启动容器ApplicationContextcontext=newAnnotationConfigApplicationContext(AppConfig.class);OrderServiceorderService=context.getBean(OrderService.class);
关键优势:
- 解耦与可测试性:通过接口注入,轻松替换Mock对象进行单元测试
- 单例管理:默认单例模式优化资源开销
- 生命周期钩子:利用
@PostConstruct、@PreDestroy管理资源
AOP实战:优雅处理横切关注点
AOP(面向切面编程)将日志、事务、安全等通用逻辑与业务代码分离。
@Aspect@ComponentpublicclassLoggingAspect{//拦截Service层所有方法@Around("execution(com.example.service..(..))")publicObjectlogMethodExecution(ProceedingJoinPointjoinPoint)throwsThrowable{StringmethodName=joinPoint.getSignature().getName();longstartTime=System.currentTimeMillis();Objectresult=joinPoint.proceed();//执行目标方法longduration=System.currentTimeMillis()-startTime;System.out.printf("方法%s执行耗时:%dms%n",methodName,duration);returnresult;}}
应用场景深度解析:
- 声明式事务管理:
@Transactional注解底层由AOP实现
- 安全权限控制:通过切面进行方法级权限校验
- 性能监控:统一收集方法执行耗时
- 异常处理:全局异常通知格式化错误响应
数据访问层:JdbcTemplate与ORM整合
Spring提供统一抽象,简化数据库操作。
@RepositorypublicclassUserRepository{privatefinalJdbcTemplatejdbcTemplate;publicUserRepository(JdbcTemplatejdbcTemplate){this.jdbcTemplate=jdbcTemplate;}publicUserfindById(Longid){returnjdbcTemplate.queryForObject("SELECTid,name,emailFROMusersWHEREid=?",(rs,rowNum)->newUser(//Lambda实现RowMapperrs.getLong("id"),rs.getString("name"),rs.getString("email")),id);}}
进阶方案:
- SpringDataJPA:通过接口自动生成Repository实现
publicinterfaceUserRepositoryextendsJpaRepository<User,Long>{List<User>findByEmailContaining(Stringdomain);}
- MyBatis整合:配合
@MapperScan注解高效集成SQL映射
事务管理:ACID原则的声明式实现
@ServicepublicclassOrderProcessingService{@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,rollbackFor=Exception.class)publicvoidprocessOrder(Orderorder){inventoryService.reduceStock(order.getItems());//扣减库存paymentService.charge(order);//支付操作shippingService.scheduleDelivery(order);//安排配送}}
事务策略选择指南:
传播行为适用场景
——————-———————————-
REQUIRED(默认)存在事务则加入,无则新建
REQUIRES_NEW始终新建独立事务
NESTED嵌套事务(Savepoint机制)
SpringMVC:构建现代Web应用
@RestController@RequestMapping("/api/products")publicclassProductController{@GetMapping("/{id}")publicResponseEntity<Product>getProduct(@PathVariableLongid){returnproductService.findById(id).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}@PostMappingpublicResponseEntity<Void>createProduct(@Valid@RequestBodyProductproduct){Productsaved=productService.save(product);URIlocation=ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(saved.getId()).toUri();returnResponseEntity.created(location).build();}}
RESTful设计要点:
- 使用HTTP状态码精准表达结果(200/201/404)
- 资源命名使用复数名词(
/products)
- 利用HATEOAS实现超媒体驱动
- 版本控制通过URI路径或Header实现
SpringBoot:加速企业级开发
SpringBoot通过自动配置和起步依赖简化配置:
<!--pom.xml关键依赖--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency></dependencies>
配置最佳实践:
#application.ymlspring:datasource:url:jdbc:mysql://localhost:3306/mydb?useSSL=falseusername:rootpassword:securePass!jpa:show-sql:truehibernate:ddl-auto:update
实战经验:避免常见陷阱
- 循环依赖解决:改用构造器注入或
@Lazy延迟初始化
- 事务失效场景:避免同类方法调用(使用AOP代理)
- 性能优化:批量操作使用
JdbcTemplate.batchUpdate()
- 安全加固:始终验证用户输入,防范SQL注入
思考与互动:
你在Spring开发中遇到过最具挑战性的问题是什么?是事务管理的边界问题,微服务间的分布式事务协调,还是高并发场景下的性能优化?欢迎在评论区分享你的实战经验或技术疑问,我们将精选典型问题进行深度解析!