例子:
bean.xml
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-4.1.xsd">
测试代码
importorg.springframework.beans.factory.support.DefaultListableBeanFactory;importorg.springframework.beans.factory.xml.XmlBeanDefinitionReader;importorg.springframework.core.io.ClassPathResource;public classBeanFactoryExample {public static voidmain(String[] args) {//根据配置文件创建ClassPathResource对象
ClassPathResource resource = new ClassPathResource("com/qst/chapter08/bean.xml");//创建BeanFactory对象
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);//从BeanFactory对象中,根据id获取具体对象
Book book = (Book) factory.getBean("book");
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getPublishHouse());
System.out.println(book.getPrice());
}
}
ApplicationContext的例子
public classApplicationContextExample {public static voidmain(String[] args) {
ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("com/qst/chapter08/bean.xml");
Book book = (Book) context.getBean("book");
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getPublishHouse());
System.out.println(book.getPrice());
context.close();
}
}
例如
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-4.1.xsd">
测试类不变,需要改变bean和配置文件,测试类里的调用方法不变:
bean中加一个构造方法,配置文件中加入这个构造方法的相关配置
public classOrder {private intid;private String orderNo; //订单编号
private double amount; //订单金额
privateObject[] myArray;private List>myList;private Set>mySet;private Map, ?>myMap;privateProperties myProp;public Order(int id, String orderNo) {
this.id = id;
this.orderNo =orderNo;
}
//其他省略
}
ABCDEF
5678.123
示例如下:
public class Order {
private int id;
private String orderNo; // 订单编号
private double amount; // 订单金额
private Object[] myArray;
private List> myList;
private Set>mySet;
private Map, ?>myMap;
private Properties myProp;
public Order(int id, String orderNo) {
this.id = id;
this.orderNo = orderNo;
}
public int getId() {
return id;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public Object[] getMyArray() {
return myArray;
}
public void setMyArray(Object[] myArray) {
this.myArray = myArray;
}
public List> getMyList() {
return myList;
}
public void setMyList(List>myList) {
this.myList = myList;
}
public Set> getMySet() {
return mySet;
}
public void setMySet(Set>mySet) {
this.mySet = mySet;
}
public Map,?>getMyMap() {
return myMap;
}
public void setMyMap(Map,?>myMap) {
this.myMap = myMap;
}
public Properties getMyProp() {
return myProp;
}
public void setMyProp(Properties myProp) {
this.myProp = myProp;
}
}
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
ABCDEF
5678.123
1234
1234
1234
AAA
BBBBB
这里的继承指的是配置信息的重用,跟面向对象里的继承毫无关系.
前置依赖是指,有时要求Bean A的初始化必须在Bean B的初始化之后,而B并不是A的属性.这种情况下,无法通过ref来保证B先初始化,所以Spring提供了depends-on.
这里重点说一下by Type,by Type方式只根据类型与否匹配来决定是否注入依赖关系,加入A实例有setB(B b)方法,而Spring配置文件中恰好有一个类型B的Bean实例,则Spring会注入此实例,如果容器总没有一个类型为B的实例或多于一个的B实例,则都会抛出异常.