面试题答案
一键面试Bean的管理
- 设计理念:Spring 通过配置文件(XML 或注解)来定义 Bean,将 Bean 的创建和配置与实际业务代码分离。这种方式使得在增加新的 Bean 或者修改 Bean 的配置时,无需修改业务代码。
- 实现机制:
- 基于 XML 配置:在 XML 配置文件中,通过
<bean>
标签来定义 Bean。例如,定义一个用户服务的 Bean:
- 基于 XML 配置:在 XML 配置文件中,通过
<bean id="userService" class="com.example.UserService">
<property name="userDao" ref="userDao"/>
</bean>
当需要增加新的 Bean 时,直接在配置文件中添加新的 <bean>
标签即可,业务代码不受影响。
- 基于注解配置:使用 @Component
、@Service
、@Repository
等注解将类标记为 Bean。例如:
@Service
public class UserService {
private UserDao userDao;
@Autowired
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
如果要新增一个服务类,只需要添加对应的注解,Spring 容器就能自动识别并管理,无需修改现有业务逻辑代码。
AOP 功能实现
- 设计理念:AOP 允许将横切关注点(如日志记录、事务管理)从核心业务逻辑中分离出来,以增强现有功能。在不修改核心业务代码的前提下,通过切面(Aspect)的方式灵活地添加新的功能。
- 实现机制:
- 定义切面:使用
@Aspect
注解定义切面类,例如记录方法执行时间的切面:
- 定义切面:使用
@Aspect
@Component
public class PerformanceAspect {
@Around("execution(* com.example..*.*(..))")
public Object logPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
long end = System.currentTimeMillis();
System.out.println("Method " + joinPoint.getSignature() + " executed in " + (end - start) + "ms");
return result;
}
}
- **切点表达式**:通过 `@Pointcut` 注解或者直接在增强方法(如 `@Around`、`@Before`、`@After` 等)中定义切点表达式,来指定哪些方法需要被切面增强。上述例子中,`execution(* com.example..*.*(..))` 表示匹配 `com.example` 包及其子包下的所有方法。
- **织入**:Spring 在运行时,根据切点表达式和切面定义,将切面逻辑织入到目标方法中。当目标方法执行时,切面逻辑会按照定义的顺序执行,实现对业务功能的扩展,而无需修改目标方法的代码。