### SSM-Boot面试题详解
#### Spring IoC理解与应用
**IoC**(Inversion of Control,控制反转)是一种设计思想,在Spring框架中主要表现为“依赖注入”(Dependency Injection,简称DI)。通过依赖注入的方式,使得组件之间的依赖关系由组件本身外的第三方(比如Spring容器)来控制。这种方式降低了各个组件间的耦合性,增强了系统的灵活性。
- **代码示例**:通常在Java程序中,我们可能会直接new一个对象,但在Spring中,这种对象的创建是由Spring容器完成的。例如:
```java
// 普通方式
Service service = new Service();
// Spring方式
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Service service = (Service) context.getBean("serviceBean");
```
- **优势分析**:使用Spring的IoC容器管理对象,可以显著减少代码量,提高可维护性和可测试性。
#### AOP底层实现机制
**AOP**(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要特性,用于实现横切关注点的模块化。Spring的AOP功能主要通过**动态代理**技术来实现。
- **动态代理机制**:
- 如果目标对象实现了接口,则采用**JDK动态代理**。
- 如果目标对象没有实现接口,则采用**CGLIB动态代理**。
- **JDK动态代理**:利用JDK自身提供的Proxy类和InvocationHandler接口,通过反射机制创建代理对象。
- **CGLIB动态代理**:使用CGLIB库,对类进行字节码增强,生成新的子类。
- **动态代理示例**:
```java
// 使用JDK动态代理
public interface MyInterface {
void doSomething();
}
InvocationHandler handler = new MyInvocationHandler(new MyInterfaceImpl());
MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
MyInterface.class.getClassLoader(),
new Class[]{MyInterface.class},
handler);
// 使用CGLIB动态代理
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyClass.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// 前置通知
Object result = proxy.invokeSuper(obj, args);
// 后置通知
return result;
}
});
MyClass proxy = (MyClass) enhancer.create();
```
#### Spring Bean配置方式
Spring提供了多种不同的方式来配置和管理Bean:
1. **XML配置**:使用`<bean>`标签定义Bean及其依赖。
2. **注解配置**:
- `@Component`、`@Controller`、`@Service`、`@Repository`:标记组件类,使Spring能通过类路径扫描自动检测并注册Bean。
- `@Bean`:在配置类中定义Bean。
3. **工厂方法**:
- `factory-bean`和`factory-method`属性配置Bean的创建。
- `FactoryBean`:特定类型的工厂Bean,提供更高级的功能。
4. **构造器注入**:
- `constructor-arg`:在XML配置中指定。
5. **其他方式**:
- 使用`context:component-scan`自动扫描特定包下的组件。
- `@Autowired`和`@Value`注解用于自动装配和值注入。
#### Spring监听器及应用场景
Spring支持多种监听器机制,用于监控应用程序上下文的生命周期事件:
- **ContextLoaderListener**:用于Web应用程序,当Web容器启动时自动初始化Spring的ApplicationContext。
- **ApplicationListener**:用户可以实现此接口以定义自定义的事件监听器,处理诸如启动或关闭等事件。
- **@EventListener**:用于注解的方法,可以处理事件,简化事件监听器的编写。
#### 注解对比
- **@Resource**与**@Autowired**:
- **@Resource**:默认按名称匹配,如果没有指定name,则使用字段名或方法名作为默认值。如果找不到匹配项,则按类型匹配。
- **@Autowired**:默认按类型匹配,如果没有匹配项且required属性为true,则会抛出异常。
- **事务管理**:
- **声明式事务**:通过`@Transactional`注解或者配置文件中的`<tx:advice>`元素来实现。
- **编程式事务**:通过TransactionTemplate或PlatformTransactionManager接口来手动管理事务。
#### 对象生命周期
在Spring框架中,每个Bean都有其自己的生命周期,从创建、初始化到销毁。
- **初始化**:可以通过实现InitializingBean接口或使用`@PostConstruct`注解来定义初始化方法。
- **销毁**:可以通过实现DisposableBean接口或使用`@PreDestroy`注解来定义销毁方法。
#### SSM框架配置
在构建SSM(Spring + SpringMVC + MyBatis)框架的应用程序时,需要配置多个文件:
- **Spring配置**:
- 配置组件扫描:`<context:component-scan base-package="com.example"/>`
- 配置MyBatis的SqlSessionFactory:`<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"/>`
- 配置数据源:`<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">`
- 配置事务管理器:`<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">`
- **SpringMVC配置**:
- 配置视图解析器:`<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>`
- 配置前端控制器:`<servlet>`和`<servlet-mapping>`在web.xml中配置
- 配置拦截器:`<mvc:interceptors>`
#### Spring通知类型
Spring AOP提供了多种通知类型,用于在程序执行的不同阶段插入横切逻辑:
- **前置通知**:在目标方法执行前执行。
- **后置通知**:在目标方法执行后执行,无论方法是否成功执行。
- **返回通知**:在目标方法成功完成后执行。
- **异常通知**:在目标方法抛出异常后执行。
- **环绕通知**:围绕目标方法执行,可以在方法调用前后执行自定义的行为。
这些通知类型可以帮助开发者更好地组织和管理代码中的横切关注点,如日志记录、性能监控等。