首页 > 代码库 > Attempt-Spring-1:笔记

Attempt-Spring-1:笔记

Attempt-Spring-1:笔记

 

 

代码:

 

Books.java:

 

package qau.edu;

 

publicclass Books {

 

   privateintNumber ;

   private String name;

   privatedoubleprice ;

   publicint getNumber() {

      returnNumber;

   }

   publicvoid setNumber(int number) {

      Number = number;

   }

   public String getName() {

      returnname;

   }

   publicvoid setName(String name) {

      this.name = name;

   }

   publicdouble getPrice() {

      returnprice;

   }

   publicvoid setPrice(double price) {

      this.price = price;

   }

  

  

}

 

 

 

配置文件代码:

 

<?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">

 

 

   <bean id="book1" class="qau.edu.Books">

 

      <property name="name">

 

         <value><![CDATA[《指环王》]]></value>

 

      </property>

 

      <property name="price" value=http://www.mamicode.com/"39.23" />

 

      <property name="number" value=http://www.mamicode.com/"10002" />

 

   </bean>

 

</beans>

 

 

  1. 1.       bean.xml的配置文件只能放在src的根文件下;
  2. 2.       关于特殊的字符,必须放在“<![CDATA[]]>”之中;
  3. 3.       上面的Spring是基于“属性设值”的前提之下的,所以在配置中用的是setter对应的“<property>”节点;

 

编写测试类:

 

package qau.edu;

 

 

import java.io.IOException;

import java.lang.annotation.Annotation;

import java.util.Locale;

import java.util.Map;

 

import org.junit.Test;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;

import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationEvent;

import org.springframework.context.MessageSourceResolvable;

import org.springframework.context.NoSuchMessageException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.core.env.Environment;

import org.springframework.core.io.Resource;

 

publicclass SpringTest {

 

  

  

// 传统的方式;

  

   @Test

   publicvoid test1() {

     

//    实例化对象;

     

      Books  bo1 = new Books();

     

//    进行初始化;

     

      bo1.setName("基督山伯爵");

      bo1.setNumber(100001);

      bo1.setPrice(35.2);

     

//    进行输出;

     

      System.out.println("书籍的信息:\n\n\n书籍的名字是:" + bo1.getName() + ",书籍的代号是:"

                           + bo1.getNumber() + ",书籍的价格是:" + bo1.getPrice());

     

   }

  

  

  

// 通过Spring;

  

  

   @Test

   publicvoid test2(){

     

//    创建applicationcontext对象;

     

      ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");

     

//    获取对象;

     

      Books bo1 = (Books)ctx.getBean("book1");

     

//    输出信息;

     

      System.out.println("书籍的信息:\n" + "名字是:" + bo1.getName() + ",价格:" + bo1.getPrice());

        

        

     

  

 

}

  

}

 

总结:

 

 上面单元测试类中用的是两种方式进行的对抽象的类进行的处理,比较两种方式,就能很好的理解Spring框架的意义;

  第一种是传统的方式,即,将.java文件下的类的定义的雏形进行初始化,在main()方法下要出现“显式”的实例化和进行设置属性的代码语句;

  第二种方式之下,是通过Spring框架进行的初始化和设置的操作的(根据bean中配置的信息),在进行IOC容器的创建的时候,也就是实现ApplicationContext接口时候,他会同时的进行类的创建(对象的初始化),然后根据bean文件提供的信息进行相应的实例化。可以通过代码演示:

 

为了测试方便对POJO进行了修改;

 

 

package qau.edu;

 

public class Books {

 

    private int Number ;

    private String name;

    private double price ;

    public int getNumber() {

      

       System.out.println("调用的是getter方法、、、、、");

       return Number;

    }

    public void setNumber(int number) {

      

       System.out.println("调用的是setter方法、、、、、、");

       Number = number;

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public double getPrice() {

       return price;

    }

    public void setPrice(double price) {

       this.price = price;

    }

   

//  无参数的构造器;

   

    public Books(){

      

       System.out.println("调用的是无参数的构造方法方法、、、、、、、、、、");

    }

   

}

 

 

 

 

测试类中把显式的实例化和设置属性的语句进行注释:

 

//  通过Spring;

   

   

    @Test

    public void test2(){

      

//     创建applicationcontext对象;

      

       ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");

      

//     获取对象;

      

//     Books bo1 = (Books)ctx.getBean("book1");

      

//     输出信息;

      

//     System.out.println("书籍的信息:\n" + "名字是:" + bo1.getName() + ",价格:" + bo1.getPrice())

 

}

 

执行代码的结果:

 

 

十一月 21, 2014 5:31:09 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1e2b67c: startup date [Fri Nov 21 17:31:09 CST 2014]; root of context hierarchy

十一月 21, 2014 5:31:10 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [bean.xml]

调用的是无参数的构造方法方法、、、、、、、、、、

调用的是setter方法、、、、、、

 

 

 

所以,是Spring对实例化进行了相应的封装处理;

 

 

 

 

(二)关于“构造注入”方式的演示:

 

配置文件:

 

Ren.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">

 

   <!-- 演示和验证构造注入的相关信息 -->

  

   <bean id="book1" class="qau.edu.Books">

    

        <constructor-arg value=http://www.mamicode.com/"10003"></constructor-arg>

       

         <constructor-arg>

        

            <value><![CDATA[《平凡的世界》]]></value>

        

         </constructor-arg>

        

         <constructor-arg value=http://www.mamicode.com/"23"></constructor-arg>

  

   </bean>

 

</beans>

 

 

 

测试代码:

 

// 测试"构造注入";

  

   @Test

   publicvoid test4(){

     

     

//    创建applicationContext对象;

     

      ApplicationContext ctx2 = new ClassPathXmlApplicationContext("Ren.xml");

     

//    获取对象;

     

      Books book1 = (Books)ctx2.getBean("book1");

     

//    输出打印结果;

     

      System.out.println(book1);

   }

 

相应的Books.java中的构造方法

 

package qau.edu;

 

publicclass Books {

 

   privateintNumber;

   private String name;

   privatedoubleprice;

   privateintpage ;

 

   publicint getNumber() {

 

      System.out.println("调用的是getter方法、、、、、");

      returnNumber;

   }

 

   publicvoid setNumber(int number) {

 

      System.out.println("调用的是setter方法、、、、、、");

      Number = number;

   }

 

   public String getName() {

      returnname;

   }

 

   publicvoid setName(String name) {

      this.name = name;

   }

 

   publicdouble getPrice() {

      returnprice;

   }

  

 

   publicvoid setPrice(double price) {

      this.price = price;

   }

 

   // 无参数的构造器;

 

   publicint getPage() {

      returnpage;

   }

 

   publicvoid setPage(int page) {

      this.page = page;

   }

 

   public Books() {

 

      System.out.println("调用的是无参数的构造方法方法、、、、、、、、、、");

 

   }

 

   // 带有参数的构造方法;

   public Books(String name, double price){

      super();

     

      this.name = name;

      this.price = price;

     

   }

  

 

  

  

public Books(int number, String name, int page) {

      super();

      Number = number;

      this.name = name;

      this.page = page;

   }

 

 

 

// 编写toString()方法,用于测试方便;

  

  

@Override

public String toString() {

   return"Books [Number=" + Number + ", name=" + name + ", price=" + price

         + ", page=" + page + "]";

}

  

  

 

}

 

执行结果:

 

十一月 21, 2014 8:06:39 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1e2b67c: startup date [Fri Nov 21 20:06:39 CST 2014]; root of context hierarchy

十一月 21, 2014 8:06:39 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [Ren.xml]

Books [Number=10003, name=《平凡的世界》, price=0.0, page=23]

 

 

小总结:

 

上面的文件中,在进行构造注入的前提之下需要进行相应的构造方法的编写,需要主要的是,在进行构造方法的编写时候,参数的列表中的属性的顺序要和bean文件中的<constructor-arg>中的顺序一样的。在Java中,区分方法重载的方法就是利用方法的签名区分的。这是为了避免出错的很好的方法也是在进行编写程序中很重要的。

还有注意的就是,在进行属性注入和构造注入的联合使用的时候,在.java 也就是POJO文件中要在编写构造注入的带有参数的构造方法的时候,还要进行无参数的构造方法的重写,这是因为在进行属性注入的时候,有一个前提条件就是,需要一个默认的构造方法,也就是无参数的构造方法。(这是很容易忽略的)

 

 

(三)、演示bean之间的关系;

 

1、 引用关系:

代码:

 

配置文件

 

<?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">

 

   <!-- 演示和验证构造注入的相关信息 -->

  

   <bean id="book1" class="qau.edu.Books">

    

        <constructor-arg value=http://www.mamicode.com/"10003"></constructor-arg>

         <constructor-arg>

        

            <value><![CDATA[《平凡的世界》]]></value>

        

         </constructor-arg>

         <constructor-arg value=http://www.mamicode.com/"23"></constructor-arg>

  

   </bean>

  

  

    <!--演示bean的之间的引用  -->

   

    <bean id="body1" class="qau.edu.Body">

   

      <property name="name" value=http://www.mamicode.com/"Kobe"></property>

      <property name="age" value=http://www.mamicode.com/"36"></property>

      <property name="sex" value=http://www.mamicode.com/"男"></property>

      <property name="book" ref="book1"></property>

      <property name="book.price" value=http://www.mamicode.com/"34.4"></property>

     

    </bean>

   

    <!-- 演示List集合属性 -->

   

    <bean id="person1" class="qau.edu.Person">

   

       <property name="name" value=http://www.mamicode.com/"AAA"></property>

       <property name="age" value=http://www.mamicode.com/"29"></property>

      

       <property name="books">

      

          <list>

             <ref bean="book1"/>

          </list>

      

       </property>

      

             

      

   

    </bean>

   

</beans>

 

 

 

 

 

 

 

 

 

 

 

上面只是引用关系,利用的是在<property>节点中的<value>属性或者是<value>节点中使用“ref”关键字进行bean之间的引用的。.在上面还有就是级联关系,就是说可以通过一些方法为引用中对象的相关属性的赋值。(比如上面的:<property name="book.price" value=http://www.mamicode.com/"34.4"></property>,但是注意的是,在进行这样的赋值时,以上面为例,也就是为book的price进行间接赋值时候,必须保证book所对应的类Books类是已经进行过初始化的,不然会出现错误,这是不同于struts2中的级联关系的。

 

还有就是关于List集合属性的使用。

 

 

 

(四)、验证集合属性中的Map,properties

 

代码:

 

POJO

 

package qau.edu;

 

import java.util.Map;

import java.util.Properties;

 

publicclass CollectionDemo {

 

   private Map<String,Books> books ;

   private Properties pros ;

 

   public Map<String, Books> getBooks() {

      returnbooks;

   }

 

   publicvoid setBooks(Map<String, Books> books) {

      this.books = books;

   }

  

 

   public Properties getPros() {

      returnpros;

   }

 

   publicvoid setPros(Properties pros) {

      this.pros = pros;

   }

 

   @Override

   public String toString() {

      return"CollectionDemo [books=" + books + ", pros=" + pros + "]";

   }

 

  

  

  

}

 

 

测试类代码:

 

// 测试Map和properties集合 ;

  

   @Test

   publicvoid test7(){

     

//    创建applicationContext对象;

     

      ApplicationContext ctx2 = new ClassPathXmlApplicationContext("Ren.xml");

     

//    获取对象;

     

      CollectionDemo maps = (CollectionDemo)ctx2.getBean("map1");

     

//    输出打印结果;

     

      System.out.println(maps);

  }

 

执行结果:

 

十一月 21, 2014 11:14:10 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@811e18: startup date [Fri Nov 21 23:14:10 CST 2014]; root of context hierarchy

十一月 21, 2014 11:14:10 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [Ren.xml]

CollectionDemo [books={BB=Books [Number=10003, name=《平凡的世界》, price=34.4, page=23], AA=Books [Number=10004, name=《基督山伯爵》, price=0.0, page=24]}, pros={姓名=任建勇, 住址=青岛·八大关}]

 

 

 

 

(五)、util和P节点:

 

 

配置文件(部分):

<!--演示util节点 -->

   

    <util:list id="utils">

   

      <ref bean="book1"/>

      <ref bean="book2"/>

   

    </util:list>

   

    <!-- 演示util和p节点(前提是导入这俩个节点) -->

   

    <bean id="per" class="qau.edu.Person" p:name="Renjianong" p:age="21">

 

     <property name="books">

        <ref bean="utils"/>

       

     </property>

   

    </bean>

 

 

测试类:

 

 

// 测试util节点和P节点;

  

  

   @Test

   publicvoid test8(){

     

//    创建applicationContext对象;

     

      ApplicationContext ctx2 = new ClassPathXmlApplicationContext("Ren.xml");

     

//    获取对象;

     

      Person person = (Person)ctx2.getBean("per");

     

//    输出打印结果;

     

      System.out.println(person);

   }

 

 

执行结果:

 

 

十一月 21, 2014 11:37:16 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@b48230: startup date [Fri Nov 21 23:37:16 CST 2014]; root of context hierarchy

十一月 21, 2014 11:37:16 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [Ren.xml]

Person [name=Renjianong, age=21, books=[Books [Number=10003, name=《平凡的世界》, price=34.4, page=23], Books [Number=10004, name=《基督山伯爵》, price=0.0, page=24]]]

 

 

Attempt-Spring-1:笔记