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="39.23" /> 
 <property name="number" value="10002" /> 
 </bean> 
 </beans> 
  | 
编写测试类:
| 
 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="10003"></constructor-arg> 
 <constructor-arg> 
 <value><![CDATA[《平凡的世界》]]></value> 
 </constructor-arg> 
 <constructor-arg value="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="10003"></constructor-arg> <constructor-arg> 
 <value><![CDATA[《平凡的世界》]]></value> 
 </constructor-arg> <constructor-arg value="23"></constructor-arg> 
 </bean> 
 
 <!--演示bean的之间的引用 --> 
 <bean id="body1" class="qau.edu.Body"> 
 <property name="name" value="Kobe"></property> <property name="age" value="36"></property> <property name="sex" value="男"></property> <property name="book" ref="book1"></property> <property name="book.price" value="34.4"></property> 
 </bean> 
 <!-- 演示List集合属性 --> 
 <bean id="person1" class="qau.edu.Person"> 
 <property name="name" value="AAA"></property> <property name="age" value="29"></property> 
 <property name="books"> 
 <list> <ref bean="book1"/> </list> 
 </property> 
 
 
 
 </bean> 
 </beans> 
 
 
 
 
 
 
 
 
 
  | 
上面只是引用关系,利用的是在<property>节点中的<value>属性或者是<value>节点中使用“ref”关键字进行bean之间的引用的。.在上面还有就是级联关系,就是说可以通过一些方法为引用中对象的相关属性的赋值。(比如上面的:<property name="book.price" value="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]]] 
  | 
原文:http://www.cnblogs.com/shiguangshuo/p/4114481.html