Spring1.2——bean相关

来源:互联网 发布:不支持后端数据库设计 编辑:程序博客网 时间:2024/05/21 10:16

1、Bean的别名

      Bean的id必须是一个有效的标识符,因此id不能包含特殊字符。而Bean的别名支持各种特殊字符。

     指定别名有两种方式 :
 

  用的时候,别名和id的功能是一样的

  User user = appContext.getBean("kaka",User.class);

2、Bean获取Spring容器

      i.该Bean需要实现ApplicationContextAware接口
     ii. 必须实现该接口中setApplicationContext方法。

(1)Dog.java

public class Dog implements ApplicationContextAware{String kind;ApplicationContext appContext;public String getKind() {return kind;}public void setKind(String kind) {System.out.println("----setKind方法----");this.kind = kind;}@Overridepublic String toString() {return "Dog [kind=" + kind + "]";}public void bark(){System.out.println(appContext.getMessage("bark", null,Locale.getDefault(Category.FORMAT)));}/** * Spring会自动检测容器中所有Bean,如果发现某个Bean实现ApplicationContextAware接口, * Spring容器就会在setter方法调用之后,自动调用setApplicationContext方法 * 当Spring容器调用该方法时,它会把容器自身作为参数传入 */@Overridepublic void setApplicationContext(ApplicationContext appContext)throws BeansException {this.appContext = appContext;System.out.println(appContext);}}
(2)beans.xml配置


(3)测试:

    可以看出Spring容器就会在setter方法调用之后,自动调用setApplicationContext方法。通过打印setApplicationContext(ApplicationContext appContext)方法获取到的appContext参数可知是ClassPathXmlApplicationContext。


3、Bean的作用域

      设置Bean的作用域通过scope属性,该属性支持5种:

      - singleton:单例。在整个spring容器生命周期中,该Bean永远都是同一个。
                   何时产生?→容器创建时
                   何时消亡?→容器销毁时

      - prototype:

                   何时产生?程序getBean,spring就会创建它,然后就不管它了。
                   何时消亡?GC随时可能回收它。

        相比之下,singleton具有更好的性能。它只要创建一次,可多次重复使用。

      - request:只能在Web应用中使用,相当于一次请求内是singleton行为的。
      - session:只能在Web应用中使用,相当于一次用户会话(session)内是singleton行为的。
      - global session:只能在Portlet应用中使用,比较少用。

(1)如果没有设置scope属性,默认是singleton

       ①bean.xml配置

<!-- 默认就是singleton --><bean id="dogId" class="cony.domain.Dog"><property name="kind" value="金毛犬"></property></bean><bean id="date" class="java.util.Date" scope="prototype"/>

        ②测试代码:

public void test() throws InterruptedException{ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");System.out.println("----------------------");// 如果你的Dog是singleton,无论何时获取Bean,永远都是同一个实例。Dog dog1 = appContext.getBean("dogId",Dog.class);Dog dog2 = appContext.getBean("dogId",Dog.class);System.out.println(dog1 == dog2);//trueSystem.out.println("=====================================");                //每次getBean就会创建新的实例               Date date1 = appContext.getBean("date",Date.class);System.out.println(date1);Thread.sleep(2000);Date date2 = appContext.getBean("date",Date.class);System.out.println(date1==date2);//falseSystem.out.println(date2);}
         ③结果:

          可以看到Date两次时间都不一样,创建了两次实例

        


原创粉丝点击