zoukankan      html  css  js  c++  java
  • Spring(二)Bean入门

    一、BeanFactory介绍

    1.1、Bean:

    • 在Spring技术中是基于组件的
    • 最基本了是最常用的单元
    • 其实实例保存在Spring的容器当中

    Bean通常被定义在配置文件当中,Bean实例化由Spring的Ioc容器进行管理,Bean的实例可以通过Beanfactory进行访问,实际上大部分J2EE应用,Bean是通过ApplicationContext来访问的,ApplicationContext是BeanFactory的子接口,功能要比BeanFactory强大许多

    1.2、BeanFactory作用

    • 配置、创建以及管理Bean对象
    • 维持Bean对象之间的依赖关系
    • 负责Bean对象的生命周期

    BeanFactory常用方法:

    •  containsBean(String beanname)
    • Object getBean(String beanName)

    通常使用XmlBeanFactory类来实现

    1.3、ApplicationContext

    • 读取Bean定义文件
    • 维护Bean之间的依赖关系
    • 国际化的支持
    • 资源文件的读取getRource()方法可以轻松读取Rource对象
    • 事件传播
    • 多配置文件加载

    二、Bean定义

    2.1、基本组成

    配置文件

    • <beans/>是Sring配置文件的根节点
    • 一个<beans/>节点里面可以有多个<bean>节点

    定义<bean>节点时,通常要指定两个属性

    id:用来指明bean的标识符,这个标识符具有唯一性,Spring对bean的管理以及bean之间这种依赖关系都需要这个属性

    class: 指明该bean的具体实现类,这里不能是接口(可以是接口实现类)全路径包名.类名

    Bean在Spring容器中两种行为(通过scope来设置默认不写为singelton)

    singleton:单实例模式(默认,构造方法为private),整个Spring的容器中只有一个共享实例存在(singleton)

    non-singelton:每次请求该bean,Spring容器都会新建立一个bean实例,然后返回给程序(request,session,prototype)

    2.2、创建Bean

    Bean的命名:

    按照Java中的命名规范即可,使用清晰的,描述性的,一致的命名规范

    Bean的命名机制:

    id 当在Spring的窗口当中,查找某个Bean对象时,首先根据id进行查找,将其余作为Bean的默认名称,如果ID属性不存在,则根据Name属性进行查找(将其中的第一个名称作为默认的名称),如果ID和NAME都不存在根据类的名称进行查找

    id---------->name--------------->类名

    <bean id="id1" class="实现类"></bean>
    <bean name="id1" class="实现类"></bean>
    <bean  class="实现类"></bean>

    Bean的别名:

    通过alias属性指定:

    <alias name="指定关联的Bean的名称fromname" alias="该关联类的别名的名称toname"/>

    2.3、创建Bean步骤

    创建XML文件----写入配置信息---生成Bean类----加入Bean到配置文件

    三、Bean注入

    3.1、基本类型和String

    • 用到Value元素
    • XML解析器以String类型解析出数据

    如果属性不是String类型,属性值会通过PropertyEditors转换为其他类型

    3.2、注入Bean

     -ref元素进行标识 

    Ref元素通常有两个属性:

    bean:指定不在同一个XML文件中的bean的id

    <bean id="test" class="com.pb.test">
    <property name="user">
    <ref bean="其他的bean的id"/>
    </property>
    </bean>

    local:指定在同一个XML文件中的bean的id

    <bean id="test" class="com.pb.test">
    <property name="user">
    <ref bean="相同的XML文件中的bean的id"/>
    </property>
    </bean>

    value和ref的区别:

    使用ref元素,可以让Spring在部署时验证依赖的Bean是否真实存在

    使用value元素,进行指定仅在创建Bean实例时做验证,会导致错误的延时出现,而且还会带来额外的类型转制开销

    3.3、集合注入

    List:

    <bean id="test" class="com.pb.test">
            <property name="lists">
            <list>
            <value>1</value>
            <value>2</value>
            <value>3</value>
            </list>
            </property>
        </bean>

    Map:

    <bean id="test" class="com.pb.test">
            <property name="map">
                <map>
                    <entry key="key1">
                        <value>value1</value>
                    </entry>
                    <entry key="key2">
                        <value>key2</value>
                    </entry>
                </map>
            </property>
        </bean>

    props:

    <bean id="test" class="com.pb.test">
    <property name="props">
    <props>
    <prop key="key1">value1</prop>
    <prop key="key2">value2</prop>
    </props>
    </property>
    </bean>

    set:

     < property  name ="interest" >    
                 < set >    
                     < value > 唱歌 </ value >    
                     < value > 跳舞 </ value >    
                     < value > 书法 </ value >    
                 </ set >    
        </ property >    

    3.4、自动绑定

    通过autowire属性来设置

    no:默认的。默认为不绑定

    byName:根据属性名称自动进行绑定

    byType:根据属性类型自动进行绑定

    四、Bean的作用域

    • singleton:(单实例模式)spring容器只会存在一个共享的bean实例,并且所有针对该bean的请求只会返回同一个bean实例。
    • propertype(no-singleton):对每一次针对该bean的请求都会生成一个新的bean实例。 相当于java中的new 操作。定义为propertype的bean其生命周期很长,不易回收,通常要额外的处理。
    • request:针对每一次的http请求都会产生一个新的bean实例,Bean仅在当前的http request范围内有效
    • session:针对每一次的http请求都会产生一个新的bean实例,Bean仅在当前的http session范围内有效

    五、Bean管理生命周期

    5.1、Bean的生命周期

    5.2、生命周期管理

    两个时机

    Spring可以管理实例化bean之间以及销毁之前的行为

    注入依赖关系之后:

    • 使用init-method属性:通过指定init-method属性,确定某个方法应该在Bean依赖关系结束之后执行。这种方式无需要将代码与Spring的接口耦合在一起代码污染极小。通常在bean当中进行方法定义如init()方法,然后在配置文件Bean元素中加入init-method属性来实现这个过程。
    • 实现InnitializingBean接口:这种方式无须指明init-method属性,当窗口依赖注入以后,会自动调用afterPropertiesSet方法,它和init-method执行效果一样,但这种方式属于侵入性的代码设计不推荐使用

    销毁Bean之前:

    •  destroy-method:用于在执行Bean销毁之前所执行的方法,这种方式和init-method一样无压需要代码与Spring的接口耦合在一起代码污染极小。在bean中加入destory-method属性和实现这个过程
    • 实现DisposeableBean接口:无需要指明destory-method属性,当容器依赖注入以后,会自动调用destroty方法,属于侵入性代码设计不推荐使用

    六、Bean的继承

    Bean的继承:

    什么是Bean继承呢?继承是指子bean可以从父bean继承配置信息,也可以覆盖特定的配置信息,或者在父bean的基础之上加入新的配置信息,其实质类似于java中的子类与父类的继承关系,利用继承可以节省很多配置工作,在实际的项目应用中,共有的配置会配置成模板,供子bean继承,如果2个bean之间配置信息大致相同,可以采用bean的继承来减少配置工作

    Bean的模板:

    在Spring中既然要将公用的配置,配置称模板,这个模板不需要被实例化,而仅仅作为子bean的模板来使用,但在ApplicationContext或者BeanFactory默认会初始化所有的bean.

    使用abstract属性,该属性可以阻止模板被实例化

    abstract="true"时,表示该bean是抽象的bean,不能被初始化。

  • 相关阅读:
    48. 旋转图像(顺时针)
    560. 和为K的子数组
    75. 颜色分类(三指针移动||计数排序)
    670. 最大交换
    常见端口号汇总
    springboot解决跨域问题跨域
    jad使用
    tomcat9:解决tomcat catalina log和localhost log中文乱码
    JUC:阻塞队列
    JUC:读写锁
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4399387.html
Copyright © 2011-2022 走看看