码迷,mamicode.com
首页 > 其他好文 > 详细

装配bean

时间:2015-11-23 01:00:30      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

spring提供两种容器

  • Bean工厂:最简单的容器,提供基本的DI支持。
  • 应用上下文:基于beanfactory之上构建,提供面向应用的服务:例如解析文件信息的能力,以及发布应用事件的能力。
    • ClassPathXmlApplicationContext:  xml中读取。
    • FileSystemXmlapplicaitonContext:  系统中,~/  d:/
    • XmlWebApplicaitonContext:  web应用下的xml配置文件。
  • Bean的注入:构造器和setter,创建可以用工厂单例。
  • Bean的作用域:默认是single,scope=“prototype”可以每次都创建一个;不同上下文创建的不一样。
  • 生命周期:
    • 可以在bean里声明init-method和destroy-method
    • 也可以在beans中声明default-init-method,这种是执行自己类中的方法。
    • 两者都有时,执行bean中的方法,覆盖default。
    • 关键是针对于每个bean的,你声明多少bean就有多少个init和destroy方法。
  • 注入:
    • 注入值:<property name="xxx" value="xxx">
    • 注入对象:<property name="xxx" ref="xxx">  可以注入内部bean,这样没有名字。
    • 注入集合
      • list
      • set
      • map
      • properties:如果map的key和value都为基本类型,则用properties
    • 注入空值

下面是代码

public interface Star {
    public void singASong () ;
}

public class SuperStar implements Star{

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void init(){
        System.out.println("SuperStar init");

    }
    public void singASong () {
        System.out.println(name + "巨星在唱歌");
    }
}

public interface Perform {

    public void perform ();
    public void performlist ();
    public void performmap();
}

public class PerformShow implements Perform{
    private Star star;
    private String cost;

    private List<Star> starList;
    private Map<String,Star> starMap;

    //for constructor-arg
    public PerformShow() {
    }

    public PerformShow(Star star,String cost) {
        this.star = star;
        this.cost = cost;
    }
    private static class singleTon{
        static Perform instance = new PerformShow();
    }

    //for setter property
    public void setStar(Star star) {
        this.star = star;
    }

    public void setCost(String cost) {
        this.cost = cost;
    }

    //for setter list
    public void setStarList(List<Star> starList) {
        this.starList = starList;
    }

    //for setter map
    public void setStarMap(Map<String, Star> starMap) {
        this.starMap = starMap;
    }

    //singlton
    public static Perform getInstance (){
        return singleTon.instance;
    }

    //init destroy
    public void init(){
        System.out.println("PerformShow INIT");
    }

    public void destroy(){
        System.out.println("PerformShow destroy");
    }

    //funtion
    public void perform(){
        System.out.println(cost);
        star.singASong();
    }

    public void performlist(){
        System.out.println(cost);
        for(Star star:starList){
            star.singASong();
        }
    }

    public void performmap(){
        System.out.println(cost);
        for(Map.Entry<String,Star> mapEntry:starMap.entrySet()){
            mapEntry.getValue().singASong();
        }
    }
}

xml为

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
        default-init-method="init">

       <bean id="performconstructor" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow">
              <!--构造器注入,简单值用value,对象用再声明一个bean,ref-->
              <constructor-arg ref="star"/>
              <constructor-arg value="constructor花了好几百万"/>
       </bean>

       <bean id="performsetter" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow">
              <!--构造器注入,简单值用value,对象用再声明一个bean,ref-->
              <property name="star" ref="star"/>
              <property name="cost" value="setter花了好几百万"/>
       </bean>

       <bean id="performlist" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow">
              <!--构造器注入,简单值用value,对象用再声明一个bean,ref-->
              <property name="starList">
                      <list>
                             <ref bean="star1"/>
                             <ref bean="star2"/>
                             <ref bean="star3"/>
                             <ref bean="star4"/>
                      </list>
              </property>
              <property name="cost" value="setter list花了好几百万"/>
       </bean>

       <bean id="performap" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow">
              <!--构造器注入,简单值用value,对象用再声明一个bean,ref-->
              <property name="starMap">
                     <map>
                            <entry key="巨星1" value-ref="star1"/>
                            <entry key="巨星2" value-ref="star2"/>
                            <entry key="巨星3" value-ref="star3"/>
                            <entry key="巨星4" value-ref="star4"/>
                     </map>
              </property>
              <property name="cost" value="setter map花了好几百万"/>
       </bean>


       <!--工厂singleton-->
       <!--<bean id="performSingle" class="spring.in.action.bean.beanInjectionInitDestroy.PerformShow"-->
             <!--factory-method="getInstance">-->
       <!--</bean>-->


       <bean id="star" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar">
              <property name="name" value="刘德华"/>
       </bean>

       <bean id="star1" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar">
              <property name="name" value="刘德华"/>
       </bean>
       <bean id="star2" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar">
              <property name="name" value="黎明"/>
       </bean>
       <bean id="star3" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar">
              <property name="name" value="张学友"/>
       </bean>
       <bean id="star4" class="spring.in.action.bean.beanInjectionInitDestroy.SuperStar">
              <property name="name" value="郭富城"/>
       </bean>
</beans>

测试类为

public class TestBeanInjectionInitDestroy {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-injection-init-destroy.xml");
        Perform performconstructor = (Perform)context.getBean("performconstructor");
        System.out.println("constructor start=====>>>>>>>>>>     " + performconstructor.hashCode());
        performconstructor.perform();

        Perform performsetter = (Perform)context.getBean("performsetter");
        System.out.println("setter  start=====>>>>>>>>>>     " + performsetter.hashCode());
        performsetter.perform();

        Perform performlist = (Perform)context.getBean("performlist");
        System.out.println("setter list  start=====>>>>>>>>>>     " + performlist.hashCode());
        performlist.performlist();

        Perform performmap = (Perform)context.getBean("performap");
        System.out.println("setter map  start=====>>>>>>>>>>     " + performmap.hashCode());
        performmap.performmap();

//        Perform performSingle = (Perform)context.getBean("performSingle");
//        System.out.println(performSingle.hashCode());

    }

}

结果为

SuperStar init
PerformShow INIT
PerformShow INIT
SuperStar init
SuperStar init
SuperStar init
SuperStar init
PerformShow INIT
PerformShow INIT
constructor start=====>>>>>>>>>>     846857501
constructor花了好几百万
刘德华巨星在唱歌
setter  start=====>>>>>>>>>>     1759890638
setter花了好几百万
刘德华巨星在唱歌
setter list  start=====>>>>>>>>>>     1189682735
setter list花了好几百万
刘德华巨星在唱歌
黎明巨星在唱歌
张学友巨星在唱歌
郭富城巨星在唱歌
setter map  start=====>>>>>>>>>>     1924973575
setter map花了好几百万
刘德华巨星在唱歌
黎明巨星在唱歌
张学友巨星在唱歌
郭富城巨星在唱歌

 

   

装配bean

标签:

原文地址:http://www.cnblogs.com/damiao-hungry/p/4987218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!