一、Spring
1.IOC
(1)原理
利用(反射+工厂)技术,根据配置文件中给出的类名生成相应的对象。
Class.forName(className).newInstance()
- Tomcat启动Spring容器;
- 初始化Spring容器,加载application.xml配置文件;
- 获取扫描包下所有class文件;
- 解析class中的注解信息;
- 通过反射实例化相应bean对象,以<beanId,bean>的形式保存集合,存储在IOC容器中。
- 通过ApplicationContext的getBean方法获取Bean
(2)将一个类声明为 Bean 的注解有哪些?
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注。@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。@Controller
: 对应 Spring MVC 控制层,主要用于接受用户请求并调用Service
层返回数据给前端页面。
(3)@Autowired 和 @Resource 的区别是什么?
Autowired
属于 Spring 内置的注解,默认的注入方式为byType,
会优先根据接口类型匹配并注入 Bean (接口的实现类)。
当一个接口存在多个实现类时,注入方式会变为 byName
(根据名称进行匹配),寻找与变量名相同的类名,但更推荐通过 @Qualifier
注解来显式指定名称而不是依赖变量的名称
// SmsService 接口有两个实现类: SmsServiceImpl1和 SmsServiceImpl2
// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;
// 正确注入 SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;
@Resource
属于 JDK 提供的注解,默认注入方式为 byName
。如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType
。
@Resource
有两个比较重要且日常开发常用的属性:name
(名称)、type
(类型)。如果仅指定 name
属性则注入方式为byName
,如果仅指定type
属性则注入方式为byType
,如果同时指定name
和type
属性(不建议这么做)则注入方式为byType
+byName
。
// 报错,byName 和 byType 都无法匹配到 bean
@Resource
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Resource
private SmsService smsServiceImpl1;
// 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;
总结:
@Autowired
是 Spring 提供的注解,@Resource
是 JDK 提供的注解。Autowired
默认的注入方式为byType
(根据类型进行匹配),@Resource
默认