开启注解配置 @Autowired @Resource
context:annotation-config/和context:component-scan这两个可以同时开启也没什么影响
context:component-scan包含了context:annotation-config这个功能
Java注解的配置方式 需要在XML中配置 base-package为配置扫描路径:context:component-scan/

@Autowired是根据类型来注入
默认按照Bean的类型进行装配。用于对Bean的属性变量、属性的Set方法及构造函数进行标注,配合对应的注解处理器完成Bean 的自动配置工作。
@Resource
其作用与 Autowired 一样。其区别在于 @Autowired 默认按照 Bean 类型装配,而 @Resource 默认按照 Bean 实例名称进行装配。
@Resource 中有【两个重要属性】:name 和 type。
Spring 将 name 属性解析为 Bean 实例名称,type 属性解析为 Bean 实例类型。如果指定 name属性,则按实例名称进行装配;如果指定 type 属性,则按 Bean 类型进行装配。
如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果都无法匹配,则抛出 NoSuchBeanDefinitionException 异常。

1)、SpringXML配置bean元素相关属性
springXML配置bean元素的概念:作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要时注入应用程序中,从而对组件之间依赖关系进行了解耦。这一切都离不开 Spring 配置文件中使用的 元素。

元素的常用属性
(1)、id:是一个 Bean 的唯一标识符,Spring 容器对 Bean 的配置和管理都通过该属性完成
(2)、name:Spring 容器同样可以通过此属性对容器中的 Bean 进行配置和管理,name 属性中可以为 Bean 指定多个名称,每个名称之间用逗号或分号隔开
(3)、class:该属性指定了 Bean 的具体实现类,它必须是一个完整的类名,使用类的全限定名
(4)、scope:用于设定 Bean 实例的作用域,【其属性值有 singleton(单例)、prototype(原型)】
(5)、property: 元素的子元素,用于调用 Bean 实例中的 Set 方法完成属性赋值,从而完成依赖注入。该元素的 name 属性指定 Bean 实例中的相应属性名
(6)、和 等元素的子元素索引,该元素中的 bean 属性用于指定对 Bean 工厂中某个Bean 实例的引用
(7)、和 等元素的子元素,用于直接指定一个常量值
(8)、用于封装 List 或数组类型的依赖注入
(9)、用于封装 Set 类型属性的依赖注入
(10)、用于封装 Map 类型属性的依赖注入
(11)、元素的子元素,用于设置一个键值对。其 key 属性指定字符串类型的键值,ref或 value 子元素指定其值

bean 的id 和 name的区别
唯一没有区别的就是:id和name都是spring 容器中bean 的【唯一标识符】。
区别在于: (1)、id: 一个bean的唯一标识 , 命名格式必须符合XML ID属性的命名规范
(2)、name: 可以用特殊字符,并且一个bean可以用多个名称:name=“bean1,bean2,bean3”,用逗号或者分号或者空格隔开。如果没有id,则name的第一个名称默认是id

spring 容器如何处理同名bean【同名bean:多个bean 有相同的 name 或者 id,称之为同名bean】
注意:同一个spring配置文件中,bean的 id、name是不能够重复的,否则spring容器启动时会报错。
如果一个spring容器从多个配置文件中加载配置信息,则多个配置文件中是允许有同名bean的,并且后面加载的配置文件的中的bean定义会覆盖前面加载的同名bean。
1、在spring同一个配置文件中,不能存在id相同的两个bean,否则会报错。
2、在两个不同的spring配置文件中,可以存在id相同的两个bean,启动时,不会报错。这是因为springioc容器在加载bean的过程中,类DefaultListableBeanFactory会对id相同的bean进行处理:后加载的配置文件的bean,覆盖先加载的配置文件的bean。DefaultListableBeanFactory类中,有个属性allowBeanDefinitionOverriding,默认值为true,该值就是用来指定出现两个bean的id相同的情况下,如何进行处理。如果该值为false,则不会进行覆盖,而是抛出异常。