答:
@Configuration
@Bean
总结: Spring AOT 在构建期静态分析应用,预生成高效的初始化代码,替代耗时的运行时动态处理,从而优化启动性能和资源消耗,并为原生编译铺路。
答:IoC(控制反转)和AOP(面向切面编程)。
答:IoC是设计思想(控制权反转),DI是实现方式(依赖注入)。Spring通过DI实现IoC。
答:ApplicationContext是BeanFactory的子接口,提供更多企业级功能(如事件发布、国际化等),且默认预加载单例Bean。
答:XML中scope属性,或注解@Scope(\"prototype\")。
scope
@Scope(\"prototype\")
答:实例化→属性填充→BeanNameAware→BeanFactoryAware→ApplicationContextAware→BeanPostProcessor前置处理→@PostConstruct→InitializingBean→自定义init方法→BeanPostProcessor后置处理→使用中→@PreDestroy→DisposableBean→自定义destroy方法。
// 三级缓存结构singletonFactories // 三级:存放Bean工厂(ObjectFactory)earlySingletonObjects // 二级:存放早期引用singletonObjects // 一级:存放完整Bean
三级缓存解决循环依赖流程(Spring 6 优化)
关键点:三级缓存(singletonFactories)存储 ObjectFactory`,支持 AOP 代理对象的提前创建
singletonFactories)存储
答:不能。因为构造器注入必须在实例化阶段完成,此时Bean未放入缓存。
@Autowired
@Qualifier
@Resource
答:XML中通过、
答:功能相同,均为声明Bean。语义区分:
@Controller:Web层@Service:业务层@Repository:数据层(转换持久层异常)@Component:通用组件
@Controller
@Service
@Repository
@Component
答:Bean在首次使用时才创建,而非容器启动时。通过@Lazy(true)配置。
@Lazy(true)
答:使用@Conditional注解,实现Condition接口自定义条件。
@Conditional
Condition
public class MyCondition implements Condition { public boolean matches(ConditionContext ctx, AnnotatedTypeMetadata meta) { return ctx.getEnvironment().containsProperty(\"enable.feature\"); }}
BeanFactory
FactoryBean
getObject()
答:实现ApplicationContextAware接口或直接注入ApplicationContext。
ApplicationContextAware
ApplicationContext
答:定义Bean的元数据(类名、作用域、属性等),Spring根据BeanDefinition创建Bean。
答:解析${}占位符,替换为属性文件中的值。
${}
答:通过HierarchicalBeanFactory接口,子容器可以访问父容器的Bean,但父容器不能访问子容器。
HierarchicalBeanFactory
答: Spring6仍优先使用 JDK 动态代理(需接口),但 CGLIB 移除了对 ASM 的依赖,改用 ByteBuddy
Proxy
InvocationHandler
答:XML配置,或注解@EnableAspectJAutoProxy(proxyTargetClass=true)。
@EnableAspectJAutoProxy(proxyTargetClass=true)
@Before
@After
@AfterReturning
@AfterThrowing
@Around
#mermaid-svg-fYPfcaXIzHjjF9YC {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fYPfcaXIzHjjF9YC .error-icon{fill:#552222;}#mermaid-svg-fYPfcaXIzHjjF9YC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fYPfcaXIzHjjF9YC .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-fYPfcaXIzHjjF9YC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fYPfcaXIzHjjF9YC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fYPfcaXIzHjjF9YC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fYPfcaXIzHjjF9YC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fYPfcaXIzHjjF9YC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fYPfcaXIzHjjF9YC .marker.cross{stroke:#333333;}#mermaid-svg-fYPfcaXIzHjjF9YC svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fYPfcaXIzHjjF9YC .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fYPfcaXIzHjjF9YC .cluster-label text{fill:#333;}#mermaid-svg-fYPfcaXIzHjjF9YC .cluster-label span{color:#333;}#mermaid-svg-fYPfcaXIzHjjF9YC .label text,#mermaid-svg-fYPfcaXIzHjjF9YC span{fill:#333;color:#333;}#mermaid-svg-fYPfcaXIzHjjF9YC .node rect,#mermaid-svg-fYPfcaXIzHjjF9YC .node circle,#mermaid-svg-fYPfcaXIzHjjF9YC .node ellipse,#mermaid-svg-fYPfcaXIzHjjF9YC .node polygon,#mermaid-svg-fYPfcaXIzHjjF9YC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fYPfcaXIzHjjF9YC .node .label{text-align:center;}#mermaid-svg-fYPfcaXIzHjjF9YC .node.clickable{cursor:pointer;}#mermaid-svg-fYPfcaXIzHjjF9YC .arrowheadPath{fill:#333333;}#mermaid-svg-fYPfcaXIzHjjF9YC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fYPfcaXIzHjjF9YC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fYPfcaXIzHjjF9YC .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-fYPfcaXIzHjjF9YC .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-fYPfcaXIzHjjF9YC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fYPfcaXIzHjjF9YC .cluster text{fill:#333;}#mermaid-svg-fYPfcaXIzHjjF9YC .cluster span{color:#333;}#mermaid-svg-fYPfcaXIzHjjF9YC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fYPfcaXIzHjjF9YC :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}异常正常Around前Before目标方法AfterThrowingAfterReturningAfterAround后
答:使用AspectJ表达式,如execution(* com.service.*.*(..))。
execution(* com.service.*.*(..))
答:实现Ordered接口或使用@Order注解,值越小优先级越高。
Ordered
@Order
答:在通知方法中使用JoinPoint参数(非环绕)或ProceedingJoinPoint(环绕),调用getArgs()。
JoinPoint
ProceedingJoinPoint
getArgs()
答:在@AfterReturning中通过returning属性绑定返回值并修改,或在@Around中修改proceed()的返回值。
returning
proceed()
答:在@AfterThrowing中通过throwing属性绑定异常,或在@Around中捕获proceed()的异常。
throwing
TransactionTemplate.execute()
@Transactional
答:基于AOP + TransactionInterceptor拦截器
TransactionInterceptor
答:类(所有public方法)、接口(不推荐)、方法(推荐public方法)。
@Transactional(propagation = Propagation.REQUIRES_NEW)public void methodA() { // 新建独立事务,外层事务挂起}
REQUIRED
REQUIRES_NEW
SUPPORTS
NOT_SUPPORTED
MANDATORY
NEVER
NESTED
DEFAULT
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
SERIALIZABLE
RuntimeException
rollbackFor
// 自调用导致事务失效public void save() { this.update(); // 未经过代理类}@Transactionalpublic void update() {...}
@Autowired private MyService self;
答:使用@Transactional(rollbackFor = MyException.class)。
@Transactional(rollbackFor = MyException.class)
答:@Transactional(timeout = 5)(单位:秒)。
@Transactional(timeout = 5)
答:@Transactional(readOnly=true),优化数据库引擎(如MySQL只读时使用InnoDB只读视图)。
@Transactional(readOnly=true)
DispatcherServlet
HandlerMapping
HandlerAdapter
ViewResolver
HandlerExceptionResolver
@GetMapping
@RequestMapping(method=RequestMethod.GET)
RequestMappingHandlerMapping
答: 关键类:HandlerMethodArgumentResolver实现类
HandlerMethodArgumentResolver
@RequestParam
@PathVariable
@RequestBody
HttpServletRequest
答:使用@RestController或@ResponseBody,并添加Jackson依赖。
@RestController
@ResponseBody
@PostMapping(\"/upload\")public String upload(@RequestParam(\"file\") MultipartFile file) { file.transferTo(new File(\"/path/to/save\"));}
答:使用@ControllerAdvice + @ExceptionHandler。
@ControllerAdvice
@ExceptionHandler
@ControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception ex) { ModelAndView mav = new ModelAndView(\"error\"); mav.addObject(\"msg\", ex.getMessage()); return mav; }}
答:实现HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion方法,并注册到WebMvcConfigurer。
HandlerInterceptor
preHandle
postHandle
afterCompletion
WebMvcConfigurer
答:返回\"redirect:/path\"。
\"redirect:/path\"
答:使用@RequestHeader(\"User-Agent\") String userAgent。
@RequestHeader(\"User-Agent\") String userAgent
答:使用@Valid注解参数,并配合JSR-303注解(如@NotNull)在实体类上。
@Valid
@NotNull
答:JPA是规范,Hibernate是实现。
答:CrudRepository(基础CRUD)、JpaRepository(扩展分页/排序)。
CrudRepository
JpaRepository
答:根据方法名自动解析,如findByUsername(String username)。
findByUsername(String username)
答:自定义JPQL或原生SQL查询。
Page<User> findAll(Pageable pageable);// 调用:repository.findAll(PageRequest.of(0, 10));
答:瞬时(Transient)、托管(Managed)、游离(Detached)、删除(Removed)。
@EntityGraph
JOIN FETCH
@EntityGraph(attributePaths = \"orders\") // 指定立即加载的关联List<User> findAll();
@Entitypublic class Product { @Version private Long version; // 更新时自动校验版本}
答:FactoryBean返回的是getObject()方法创建的对象,而非自身;FactoryBean 优先初始化,但其生产的 Bean 延迟加载(需通过 & 前缀获取 FactoryBean 本身)
&
public class CustomBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String name) { if (bean instanceof MyService) { // 修改Bean实例 } return bean; }}
答:通过BeanDefinitionRegistry编程式注册:
BeanDefinitionRegistry
GenericBeanDefinition beanDef = new GenericBeanDefinition();beanDef.setBeanClass(MyBean.class);registry.registerBeanDefinition(\"myBean\", beanDef);
ApplicationEvent
ApplicationListener
ApplicationEventPublisher
@Transactional(propagation = Propagation.REQUIRED)public void methodA() { methodB(); // 内嵌事务}@Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB() {...}
答:AOT 模式下不支持动态代理,需提前生成代理类;BeanPostProcessor 需静态注册。
BeanPostProcessor
答:ReactiveAdapterRegistry 支持 Project Reactor/RxJava,与 Spring WebFlux 深度集成。
ReactiveAdapterRegistry
spring-boot-aot-plugin
@NativeHint
JdbcClient
答:简化 JDBC 操作,链式调用代替 JdbcTemplate
JdbcTemplate
jdbcClient.sql(\"SELECT * FROM user WHERE id=?\").param(1).query(User.class);
答:通过 MessageSource 动态填充错误消息
MessageSource
detail.setDetail(messageSource.getMessage(\"error.not_found\", null, locale));