zoukankan      html  css  js  c++  java
  • 第二章 装配Bean

    装配:创建对象之间写作关系的行为

    2.1声明Bean

      2.1.1创建spring配置

      创建spring配置,创建一个springbean.xml的文件:

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <beans xmlns="http://www.springframework.org/schema/beans"
    3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    5     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    6     
    7     
    8 </beans>
    View Code

      <beans>内部可以放置spring的所有配置信息,包括<bean>的声明

      2.1.2声明一个简单的bean

      首先:创建的maven的工程(maven的配置以及eclipse配置maven捣鼓了半天);

      

      下面是每个文件的代码:

      pom.xml文件,就不介绍pom.xml文件了(自己也不是很熟),只要在<dependency>标签里配置上依赖的jar包,若是本地maven仓库里有jar包,就不会下载,若是没有,就会自动去下载(前提是装了maven),而且会自动把包导入到Maven Dependencies(就是上图中倒数第二个箭头的文件)包类库中:

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     2   <modelVersion>4.0.0</modelVersion>
     3   <groupId>com.siaction.chapter01</groupId>
     4   <artifactId>chapter01</artifactId>
     5   <version>0.0.1-SNAPSHOT</version>
     6   
     7   <dependencies>
     8       <!-- log4j的依赖 -->
     9       <dependency>
    10         <groupId>log4j</groupId>
    11         <artifactId>log4j</artifactId>
    12         <version>1.2.14</version>
    13     </dependency>
    14     <!-- junit的依赖 -->
    15       <dependency>
    16           <groupId>junit</groupId>
    17           <artifactId>junit</artifactId>
    18           <version>4.11</version>
    19           <scope>test</scope>
    20       </dependency>
    21       <!-- spring beans的依赖 -->
    22       <dependency>
    23           <groupId>org.springframework</groupId>
    24           <artifactId>spring-beans</artifactId>
    25           <version>4.2.9.RELEASE</version>
    26       </dependency>
    27       <!-- spring context(应用上下文的依赖) -->
    28       <dependency>
    29           <groupId>org.springframework</groupId>
    30           <artifactId>spring-context</artifactId>
    31           <version>4.2.9.RELEASE</version>
    32       </dependency>
    33       
    34   </dependencies>
    35 </project>
    View Code

       springbean.xml文件:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     5     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
     6     
     7     <!-- 名字为duke的bean -->
     8     <bean id="duke" class="com.springinaction.springidol.Juggler"></bean>
     9     
    10 </beans>
    View Code

      log4j.properties的文件,这个文件通用的,哪里都能找到:

    1 # Global logging configurationuff0cu5efau8baeu5f00u53d1u73afu5883u4e2du8981u7528debug
    2 log4j.rootLogger=DEBUG, stdout
    3 # Console output...
    4 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    5 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    6 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    View Code

      Performer接口

     1 package com.springinaction.springidol;
     2 
     3 /**
     4  * 表演者的接口
     5  */
     6 public interface Performer {
     7     
     8     /**
     9      * 表演的方法
    10      * @throws Exception
    11      */
    12     void perform() throws Exception;
    13     
    14     
    15 }
    View Code

      Juggler实现类:

     1 package com.springinaction.springidol;
     2 
     3 /**
     4  * Performer的一个实现类:Juggler
     5  *
     6  */
     7 public class Juggler implements Performer {
     8     
     9     //Juggler有一个豆袋子,初始值是3
    10     private int beanBags = 3;
    11     
    12     public Juggler(){}
    13     
    14     public Juggler(int beanBags){
    15         this.beanBags = beanBags;
    16     }
    17     
    18     //表演抛豆袋子
    19     public void perform() throws Exception {
    20         
    21         System.out.println("JUGGLING "+beanBags+" BENABAGS");
    22     
    23     }
    24 
    25 }
    View Code

      TestCase测试用例:

     1 package com.springinaction.test;
     2 
     3 import org.junit.Test;
     4 import org.springframework.context.ApplicationContext;
     5 import org.springframework.context.support.ClassPathXmlApplicationContext;
     6 
     7 import com.springinaction.springidol.Performer;
     8 
     9 
    10 public class TestCase {
    11     
    12     //这个ClassPathXmlApplicationContext是springframe-context中
    13     //org.springframework.context.support包下的类
    14     ApplicationContext ac = new ClassPathXmlApplicationContext("spring/springbean.xml");//注意路径
    15     
    16     @Test
    17     public void testPerformer() throws Exception {
    18         
    19         Performer duke = (Performer) ac.getBean("duke");
    20         duke.perform();
    21         
    22     }
    23     
    24 }
    View Code

      结果,注意这里的bean是单例的bean,上面语句debug有说明(singleton bean 'duke'):

      

       2.1.3构造器注入bean

        此时,将springbean.xml文件中的duke bean的标签中加点内容,注意这个要有对应的构造函数,就是上述中的有参数的构造函数:

    1 <!-- 名字为duke的bean -->
    2     <bean id="duke" class="com.springinaction.springidol.Juggler">
    3         <!-- 通过构造器为beanBags赋值 -->
    4         <constructor-arg value="15"/>
    5     </bean>
    View Code

      下面分别是通过构造器注入对象引用工厂方法(factory-method)获得bean(其他的代码就不展示了,最下面有源码):

     1 <!-- 声明一个sonnet29的bean -->
     2     <bean id="sonnet29" class="com.springinaction.springidol.Sonnet29"></bean>
     3     
     4     <!--声明一个PoeticJuggler的bean,并且通过构造器注入,对应的引用,ref位引用依赖的bean  -->
     5     <bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler">
     6         <constructor-arg value="15"/>
     7         <constructor-arg ref="sonnet29"/>
     8     </bean>
     9     
    10     <!-- Stage是个到单例类, 构造函数私有化
    11         factory-method='方法名'
    12         创建bean的时候,就调用这个方法
    13     -->
    14     <bean id="theStage" class="com.springinaction.springidol.Stage" factory-method="getInstance"></bean>
    View Code

      2.1.4 Bean的作用域

      spring所有的bean默认都是单例的。<bean>有scope属性设置成prototype就变成多例的了;

    1 <!-- scope='prototype'就变成多例 -->
    2     <bean id="ticket" class="com.springinaction.springidol.Ticket" scope="prototype"></bean>
    View Code

      测试:

     1 //测试多例bean
     2     @Test
     3     public void testTicket() throws Exception {
     4         
     5         Ticket ticket1 = (Ticket) ac.getBean("ticket");
     6         Ticket ticket2 = (Ticket) ac.getBean("ticket");
     7         
     8         System.out.println(ticket1==ticket2);//结果是false
     9         
    10     }
    View Code

      scope的取值:

      2.1.5 初始化和销毁bean

      init-method和destory-method方法,为bean定义初始化和销毁操作(bean的属性);

      init-method属性指定了在初始化Bean时要调用的方法。

      destory-method属性指定了Bean从容器移除之前要调用的方法。

      若是很多bean有相同的名字的初始化和销毁方法,可以为<beans>标签中加上default-init-method='方法名' ,default-destroy-method='方法名';

    2.2注入Bean属性

      2.2.1 通过setter注入简单值

      <bean><property name="" value="" ></property></bean>;name的值是bean的属性,value的值是将要赋的值;

    1 <!-- com.springinaction.springidol.Instrumentalist
    2         这个类有一个song的属性,现在赋值为“认真的雪”;
    3         注意:这个类一定要有setter方法,
    4         没有setter方法抛出NotWritablePropertyException
    5      -->
    6     <bean id="kenny" 
    7         class="com.springinaction.springidol.Instrumentalist">
    8         <property name="song" value="认真的雪"></property>
    9     </bean>
    View Code

      2.2.2 引用其他Bean

      <property>属性ref="" 就是引用另一个bean

    1 <!-- 乐器:saxophone -->
    2     <bean id="saxophone" class="com.springinaction.springidol.Saxophone"></bean>
    3     <!-- ref='saxophone',直接引用上边的bean -->
    4     <bean id="kenny" 
    5         class="com.springinaction.springidol.Instrumentalist">
    6         <property name="song" value="认真的雪"></property>
    7         <property name="instrument" ref="saxophone"></property>
    8     </bean> 
    9     
    View Code

      上述方式,多个bean都引用saxophone,那他们就共用了一个bean,不共用的方法,注入内部bean:

    1  <!-- 注入内部bean,就避免了多个音乐家共用一个saxophone而产生的卫生问题 -->
    2     <bean id="kenny" 
    3         class="com.springinaction.springidol.Instrumentalist">
    4         <property name="song" value="认真的雪"></property>
    5         <property name="instrument">
    6             <bean class="com.springinaction.springidol.Saxophone"></bean>
    7         </property>
    8     </bean> 
    View Code

      2.2.3 使用Spring的命名空间p装配属性

      首先要在<beans>中引入p装配的命名空间:xmlns:p="http://www.springframework.org/schema/p"

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:p="http://www.springframework.org/schema/p"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     6     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
     7     
     8     <!-- p装配,可以和最开始的那个空容器对比多了xmlns:p="http://www.springframework.org/schema/p" -->
     9     <bean id="kenny1" 
    10         class="com.springinaction.springidol.Instrumentalist"
    11         p:song="认真的雨"
    12         p:instrument-ref="saxophone"/>
    13     
    14 </beans>
    View Code

      2.2.4 装配集合

      list装配,<ref>引用Spring上下文中的其他bean的引用,数组也可以同样装配,:

     1 <!-- 乐器:guitar 吉他 -->
     2     <bean id="guitar" class="com.springinaction.springidol.Guitar"></bean>
     3     <!-- 乐器:cymbal  钹 -->
     4     <bean id="cymbal" class="com.springinaction.springidol.Cymbal"></bean>
     5     <!-- 乐器:harmonica 口琴 -->
     6     <bean id="harmonica" class="com.springinaction.springidol.Harmonica"></bean>
     7     <!-- 一个乐队 -->
     8     <bean id="hank"
     9         class="com.springinaction.springidol.OneManBand">
    10         <property name="instruments">
    11             <list>
    12                 <ref bean="guitar"/>
    13                 <ref bean="cymbal"/>
    14                 <ref bean="harmonica"/>
    15             </list>
    16         </property>
    17     </bean>
    View Code

      set装配,下面4个<ref>,有一个是重复的,set里面只装一个:

     1 <bean id="hank1"
     2         class="com.springinaction.springidol.OneManBand">
     3         <property name="instruments">
     4             <set>
     5                 <ref bean="guitar"/>
     6                 <ref bean="cymbal"/>
     7                 <ref bean="harmonica"/>
     8                 <ref bean="harmonica"/>
     9             </set>
    10         </property>
    11     </bean>
    View Code

      map装配<map><entry key="" value-ref=""></map>:

     1 <bean id="hank2"
     2         class="com.springinaction.springidol.OneManBand">
     3         <property name="instruments">
     4             <map>
     5                 <entry key="GUITAR" value-ref="guitar"/>
     6                 <entry key="CYMBAL" value-ref="cymbal"/>
     7                 <entry key="HARMONICA" value-ref="harmonica"/>
     8             </map>
     9         </property>
    10     </bean>
    View Code

      properties集合装配,注意和map的区别:

     1 <bean id="hank3"
     2         class="com.springinaction.springidol.OneManBand">
     3         <property name="instruments">
     4             <props>
     5                 <prop key="GUITAR">GUITAR GUITAR GUITAR</prop>
     6                 <prop key="CYMBAL">CYMBAL CYMBAL CYMBAL</prop>
     7                 <prop key="HARMONICA">HARMONICA HARMONICA HARMONICA</prop>
     8             </props>
     9         </property>
    10     </bean>
    View Code

      2.2.4 装配空值

      只需<property name="属性名"><null></property>,这样就是ok了

    2.3使用表达式装配Bean

      这个感觉暂时用不上,就先不看了,以后回来再看;

    源码地址

  • 相关阅读:
    code war 天天一练(4)
    code war 天天一练(3)
    code war 天天一练(2)
    code war 天天一练(1)
    手写promise
    JSON序列化和反序列化
    SqlBulkCopy高效插入数据
    C#反射方法示例
    《将博客搬至CSDN》
    PHP学习笔记——Php文件引入
  • 原文地址:https://www.cnblogs.com/huaxueyihao/p/6581014.html
Copyright © 2011-2022 走看看