1.什么是Spring框架?
Spring是一种轻量级的、非侵入式的开发框架,旨在提高开发人员的开发效率以及系统的可维护性。
Spring 官网列出的 Spring 的 6 个特征:
- 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。
- 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
- 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。
- Web支持 : Spring MVC和Spring WebFlux Web框架。
- 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。
- 语言 :Kotlin,Groovy,动态语言。
2.一些重要的Spring模块
- Spring Core: 基础,Spring其他所有功能都需要依赖此类库,主要提供IOC依赖注入功能
- Spring Aspects: 该模块为与AspectJ的集成提供支持(AspectJ:AOP编程思想的一个实践)
- Spring AOP:提供了面向切面的编程实现
- Spring JDBC:Java数据库连接
- Spring JMS:Java消息服务
- Spring ORM:用于支持Hibernate等ORM工具(ORM即Object Relation Mapping:对象关系映射)
- Spring Web:为创建Web应用程序提供支持
- Spring Test:提供了对 Junit 和 TestNG 测试的支持
3.@RestController vs @Controller
@Controller 返回一个页面
@RestController 返回Json或Xml形式数据
@Controller+@Response 返回Json或Xml形式数据
4.Spring IOC & AOP
4.1 对于Spring IOC 和 AOP 的理解
IOC
IOC(Inverse of Contril:控制反转)是一种设计思想,就是讲原本在程序中手动创建对象的控制权,交由Spring框架来管理。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是个Map(key,value),Map中存放的是各种对象。当我们需要创建一个对象的时候,只需要配置好配置文件/注解就好,完全不用考虑对象是如何被创建出来的。
AOP
AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可扩展性和可维护性。
Spring AOP基于动态代理。
4.2 Spring AOP 和 AspectJ AOP 的区别
Spring AOP 是运行时增强,AspectJ AOP是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
5.Spring Bean
5.1 Spring中的bean的作用域有哪些?
- singleton:唯一bean实例,Spring中的bean默认是单例的。
- property:每次请求都会创建一个新的bean实例。
- request:每一次HTTP请求都会创建一个新的bean,该bean只在当前HTTP request中有效。
- session:每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
5.2 Spring中的单例bean的线程安全问题
(待解答)
5.3 @Component 和 @Bean的区别
1.作用对象不同:@Component 注解作用于类,@Bean 注解作用于方法。
2.@Component 通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean
告诉了Spring这是某个类的示例,当我需要用它的时候还给我。
3.@Bean 注解比 @Component注解的自定义性更强,而且很多地方我们只能用@Bean注解来注册@Bean。比如当我们引用第三方库中的类需要装配到Spring容器时,只能通过@Bean来实现。
@Bean 注解实例:
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
上面的代码相当于下面的xml配置:
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
下面这个例子是通过 @Component 无法实现的
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
5.4 将一个类声明为Spring的 bean 的注解有哪些?
我们一般使用 @Autowired 或 @Resource 注解自动装配 bean,要想把类标识成可用于 @Autowired 或 @Resource 注解自动装配的 bean 的类,采用以下注解可实现:
- @Component : 通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
- @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
- @service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
- @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
5.5 @Autowired与@Resource
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
5.6 Spring中的Bean的生命周期
(待解答)