•什么是Spring Bean?
    Spring IoC容器可以创建和配置应用组件对象,这里的组件对象称为Bean
    •Spring可以看作一个大型工厂,生产和管理Spring容器中的Bean。
    •使用这个工厂生产和管理Bean,需要将Bean配置在Spring的配置文件中。Spring框架支持XML和Properties两种格式的配置文件。
    元素的常用属性及其子元素``

    属性或子元素名称 描述
    id Bean在BeanFactory中的唯一标识,在代码中通过BeanFactory获取Bean实例时需要以此作为索引名
    class Bean的具体实现类
    scope 指定Bean实例的作用域
    元素的子元素,使用构造方法注入时用其指定构造方法的参数。该元素的
    index属性指定参数的序号,
    ref属性指定对BeanFactory中其它Bean的引用关系,
    type属性指定参数类型,
    value属性指定参数的常量值
    元素的子元素,用于设置一个属性。该元素的
    name属性指定Bean实例中相应的属性名称,
    value属性指定Bean的属性值,
    ref属性指定对BeanFactory中其它Bean的引用关系
    元素的子元素,用于封装List或数组类型的依赖注入
    元素的子元素,用于封装Map类型的依赖注入
    元素的子元素,用于封装Set类型的依赖注入
    元素的子元素,用于设置一个键值对

    •Spring框架实例化Bean有三种方式:
    –构造方法实例化
    在Spring框架中,Spring容器可以调用Bean对应类中无参数构造方法来实例化Bean,这种方式称为构造方法实例化
    必须有setser器
    –静态工厂实例化
    • 使用静态工厂实例化Bean时,要求开发者在工厂类中创建一个静态方法来创建Bean的实例。
    • 配置Bean时,class属性指定静态工厂类,同时还需要使用factory-method属性指定工厂类中的静态方法

    –实例工厂实例化
    • 使用实例工厂实例化Bean时,要求开发者在工厂类中创建一个实例方法来创建Bean的实例。
    • 配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要factory-method属性指定实例工厂中的实例方法。

    • 三种实例化方法的区别:

    Bean的作用域

    作用域名称 描述
    singleton 默认的作用域,使用singleton定义的Bean在Spring容器中只有一个Bean实例。
    prototype Spring容器每次获取prototype定义的Bean,容器都将创建一个新的Bean实例。
    request 在一次HTTP请求中容器将返回一个Bean实例,不同的HTTP请求返回不同的Bean实例。仅在Web Spring应用程序上下文中使用。
    session 在一个HTTP Session中,容器将返回同一个Bean实例。仅在Web Spring应用程序上下文中使用。
    application 为每个ServletContext对象创建一个实例,即同一个应用共享一个Bean实例。仅在Web Spring应用程序上下文中使用。
    websocket 为每个WebSocket对象创建一个Bean实例。仅在Web Spring应用程序上下文中使用。

    基于注解的装配
    •如果应用中有大量的Bean需要装配,会导致XML配置文件过于庞大。
    •更多的时候推荐使用注解(annotation)的方式装配Bean。

    •@Component是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。
    •现在有了Bean的实现类,但还不能进行测试,因为Spring容器并不知道去哪里扫描Bean对象。需要在配置文件中配置注解,注解配置方式如下:

    2.@Repository
    用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层Bean,其功能与@Component()相同。
    3.@Service
    用于标注一个业务逻辑组件类(Service层),其功能与@Component()相同。
    4.@Controller
    用于标注一个控制器组件类(Spring MVC的Controller),其功能与@Component()相同。
    5.@Autowired
    可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。 通过@Autowired的使用来消除setter 和getter方法。默认按照Bean的类型进行装配。
    6.@Resource
    与@Autowired功能一样。区别在于,该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要结合@Qualifier注解一起使用。
    @Resource注解有两个属性:name和type。name属性指定Bean实例名称,即按照名称来装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。
    7.@Qualifier
    与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入,则需要结合该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定。
    •虽然@Repository、@Service和 @Controller等注解的功能与@Component相同,但为了使标注类的用途更加清晰(层次化),在实际开发中推荐
    –使用@Repository标注数据访问层(DAO层)、
    –使用@Service标注业务逻辑层(Service层)、
    –使用@Controller标注控制器层(控制层)。