Spring的实例化

摘自百度:

  1. 1.实例化bean的三种方法:
    (1) 构造器

    <!-- 体验1 -->

    <bean id="personService" class="com.persia.PersonServiceBean">

    <!-- index 代表方法的参数序号,由0开始,基本的类型Type可以不声明-->
    <constructor-arg index="0" value="构造注入的name" />
    <constructor-arg index="1" type="com.persia.IDaoBean" ref="personDao"/>
    </bean>

    对应类
    public PersonServiceBean(String name, IDaoBean personDao) {
    this.name = name;
    this.personDao = personDao;
    }

    <!-- 体现2-->

    <bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean" />
    <bean id="personServiceBean" class="cn.itcast.service.impl.PersonServiceBean"
     lazy-init="true" init-method="init" destroy-method="destory">

     <!-- ref属性对应id personDao值  name属性对应接口的getter方法名称-->

     <property name="personDao" ref="personDao" />

    <!-- 体验3 -->

    <!-- 注入属性值 -->
     <property name="name" value="123"/>

     <!-- Set的注入 -->

     <property name="sets">
      <set>
       <value>sets:第一个值</value>
       <value>sets:第二个值</value>
       <value>sets:第三个值</value>
      </set>
     </property>

     <!-- List的注入 -->

     <property name="lists">
      <list>
       <value>lists:第一个值</value>
       <value>lists:第二个值</value>
       <value>lists:第三个值</value>
      </list>
     </property>

     <!-- Properties的注入 -->

     <property name="properties">
      <props>
       <prop key="props-key1">:第一个值</prop>
       <prop key="props-key2">:第二个值</prop>
       <prop key="props-key3">:第三个值</prop>
      </props>
     </property>

     <!-- Map的注入 -->

     <property name="maps">
      <map>
       <entry key="maps-key1" value=":第一个值" />
       <entry key="maps-key2" value=":第二个值" />
       <entry key="maps-key3" value=":第三个值" />
      </map>
     </property>

    </bean>
    (2) 静态工厂:

    <!-- 静态工厂获取bean -->

    <bean id="personService2" class="com.persia.PersonServiceBeanFactory" factory-method="createInstance"/>
    对应类
    public static PersonServiceBean createInstance(){
    return new PersonServiceBean();
    }
    (3) 实例工厂:

    没有静态方法,因此配置时,先实例化工厂,在实例化需要的bean。

    <!-- 实例工厂获取bean,先实例化工厂再实例化bean-->

    <bean id="fac" class="com.persia.PersonServiceBeanInsFactory"/>
    <bean id="personService3" factory-bean="fac" factory-method="createInstance"/>

    对应类
    public PersonServiceBean createInstance(){
    return new PersonServiceBean();
    }

  2. 2. bean的作用域
    默认情况为单例方式:scope=”singleton”

    singleton

    单实例作用域,这是Spring容器默认的作用域,使用singleton作用域生成的是单实例,在整个Bean容器中仅保留一个实例对象供所有调用者共享引用。单例模式对于那些无会话状态的Bean(如辅助工具类、DAO组件、业务逻辑组件等)是最理想的选择。

    prototype

    原型模式,这是多实例作用域,针对每次不同的请求,Bean容器均会生成一个全新的Bean实例以供调用者使用。prototype作用域非常适用于那些需要保持会话状态的Bean实例,有一点值得注意的就是,Spring不能对一个prototype Bean的整个生命周期负责,容器在初始化、装配好一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。因此,客户端要负责prototype实例的生命周期管理。

    request

    针对每次HTTP请求,Spring容器会根据Bean的定义创建一个全新的Bean实例, 且该Bean实例仅在当前HTTP request内有效,因此可以根据需要放心地更改所建实例的内部状态, 而其他请求中根据Bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的Bean实例将被销毁。该作用域仅在基于web的Spring ApplicationContext情形下有效。

    session

    针对某个HTTP Session,Spring容器会根据Bean定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTP Session内有效。 与request作用域一样,我们可以根据需要放心地更改所创建实例的内部状态,而别的HTTP Session中根据Bean定义创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的Bean实例也会被废弃掉。该作用域仅在基于Web的Spring ApplicationContext情形下有效。

    global session

    global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的Web应用中才有意义。portlet规范定义了全局Session的概念,它被所有构成某个portlet Web应用的各种不同的portlet所共享。在global session作用域中定义的Bean被限定于全局portlet Session的生命周期范围内。如果我们是在编写一个标准的基于Servlet的Web应用,并且定义了一个或多个具有global session作用域的Bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。该作用域仅在基于Web的Spring ApplicationContext情形下有效。

  3. 3. bean的生命周期
    (1)什么时候实例化?

    对于单例的形式,在容器实例化的时候对bean进行实例化的。www.cdtarena.com

    ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});

    单实例可以通过lazy-init=”true”,在getBean时进行实例化。

    在beans里面default-lazy-init=”true”对所有bean进行延迟处理。

    对于prototype,则是在getBean的时候被实例化的。

    (2)在bean被实例化之后执行资源操作等方法:

    Init-method=””

    (3)在bean销毁之前执行的方法:

    Destroy-method=””

    什么时候被销毁?随着spring容器被关闭时被销毁。

    调用spring容器的close方法来正常关闭。以前是随着应用程序执行完而关闭。

    AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");   ctx.close(); 《不知道对不对》


    在Spring装载配置文件后,Spring工厂实例化完成,开始处理

    (1)使用默认构造方法或指定构造参数进行Bean实例化。

    (2)根据property标签的配置调用Bean实例中的相关set方法完成属性的赋值。

    (3)如果Bean实现了BeanNameAware接口,则调用setBeanName()方法传入当前Bean的ID。

    (4)如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法传入当前工厂实例的引用。

    (5)如果Bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法传入当前ApplicationContext实例的引用。

    (6)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- BeforeInitialzation()方法将被调用。

    (7)如果在配置文件中配置Bean时设置了init-method属性,则调用该属性指定的初始化方法。

    (8)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- AfterInitialzation()方法将被调用。

    (9)Bean实例化完成,处于待用状态,可以被正常使用了。

    (10)当Spring容器关闭时,如果Bean实现了DisposableBean接口,则destroy()方法将被调用。

    (11)如果在配置文件中配置Bean时设置了destroy-method属性,则调用该属性指定的方法进行销毁前的一些处理。

    (12)Bean实例被正常销毁。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值