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="39.23" />
<property name="number" value="10002" />
</bean>
</beans>
|
- 1. bean.xml的配置文件只能放在src的根文件下;
- 2. 关于特殊的字符,必须放在“<![CDATA[]]>”之中;
- 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="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]]]
|