JavaGuide 32 道 Spring 常见面试题!万字总结!
1.IOC的理解
IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。
2.@Component
@Repository
@Service
@Controller
-
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注。 -
@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。 -
@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。 -
@Controller
: 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
这就是Spring Framework 中 @Component、@Controller、@Service 和 @Repository 之间的区别。正如我所说,它们都用于在启用上下文扫描时自动检测 Spring bean,并且在依赖注入方面提供相同的功能。
它们唯一的区别在于它们的用途,即@Controller在 Spring MVC 中用于定义控制器,它首先是 Spring bean,然后是控制器。类似地,@ Service 用于在服务层中保存业务逻辑的注释类,@Repository用于数据访问层。
3.@component和@configuration的区别
@Component和@Configuration作为配置类的差别_一号搬砖手的博客-CSDN博客_component和configuration的区别
虽然Component注解也会当做配置类,但是并不会为其生成CGLIB代理Class,所以在生成Driver对象时和生成Car对象时调用car()方法执行了两次new操作,所以是不同的对象。当使用Configuration注解时,生成当前对象的子类Class,并对方法拦截,第二次调用car()方法时直接从BeanFactory之中获取对象,所以得到的是同一个对象。
注意:假设您需要配置任何第三方类(如JdbcTemplate、Sendrgrid等)。作为spring bean,你应该使用@Configuration注解。和您的业务相关的类作为spring bean,那么您应该使用@Component注释。
4.@Autowired 和@Resource的区别
-
@Autowired
是 Spring 提供的注解,@Resource
是 JDK 提供的注解。 -
Autowired
默认的注入方式为byType
(根据类型进行匹配),@Resource
默认注入方式为byName
(根据名称进行匹配)。 -
当一个接口存在多个实现类的情况下,
@Autowired
和@Resource
都需要通过名称才能正确匹配到对应的 Bean。Autowired
可以通过@Qualifier
注解来显示指定名称,@Resource
可以通过name
属性来显示指定名称。 -
日常使用基本没有区别。但是推荐使用@Resource,因为按照名字找的快一点。