Spring框架入门之基于xml文件配置bean详解

关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0)

来源:https://www.cnblogs.com/albertrui/p/8279682.html

一、Spring中的依赖注入方式介绍

  依赖注入有三种方式

  • 属性注入
  • 构造方法注入
  • 工厂方法注入(很少使用,不推荐,本文不再介绍)

  属性注入

  通过 setter 方法注入Bean 的属性值或依赖的对象。属性注入使用 <property>元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值 。属性注入是实际应用中最常用的注入方式。HelloWorld类中的setName()方法,对应上边代码中的name属性,例如:把setName()方法名改为setName2(),property中的name属性值为name时则会报错,需要将name属性改为name2。


  构造方法

  构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。 
  构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性。使用value属性值或value子节点为属性赋值。可以同时使用索引 index 和type属性对应为哪个属性赋值。index的值表示构造函数中参数的位置。type表示成员属性的类型,例如type=“double” 

二、属性注入和构造方法注入详解:

1.applicationContext.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     xmlns:p="http://www.springframework.org/schema/p"
  5     xmlns:util="http://www.springframework.org/schema/util"
  6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  7         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd">
  8     
  9     <!-- 
 10         配置bean
 11         class:bean的全类名,通过反射的方式在IOC容器中创建bean 
 12         id:表示容器中的bean,id唯一
 13     -->
 14     <!-- 通过setter注入配置bean的属性 -->
 15     <bean id="helloWorld" class="me.spring.beans.HelloWorld">
 16         <property name="name" value="Spring"></property>
 17     </bean>
 18     <!-- 通过构造方法配置bean的属性 -->
 19     <bean id="car" class="me.spring.beans.Car">
 20         <constructor-arg value="Audi"></constructor-arg>
 21         <constructor-arg value="ShangHai"></constructor-arg>
 22         <constructor-arg value="300000"></constructor-arg>
 23     </bean>
 24 
 25     <!-- 
 26         使用构造器注入的属性值可以指定参数的类型和参数的位置,以区分重载的构造器
 27         如果字面值包含特殊字符,可以使用<![CDATA[]]>包裹起来
 28         属性值也可以使用value子节点进行配置
 29      -->
 30     <bean id="car2" class="me.spring.beans.Car">
 31         <constructor-arg value="Baoma"></constructor-arg>
 32         <constructor-arg type="java.lang.String">
 33             <value><![CDATA[<Beijing>]]></value>
 34         </constructor-arg>
 35         <constructor-arg value="240" type="int"></constructor-arg>
 36     </bean>
 37     
 38     <!-- 可以使用property的ref属性建立bean之间的引用关系 -->
 39     <bean id="person" class="me.spring.beans.Person">
 40         <property name="name" value="Tom"></property>
 41         <property name="age" value="24"></property>
 42         <!-- 
 43         <property name="car" ref="car2"></property>
 44          -->
 45          
 46         <!--  
 47         <property name="car">
 48             <ref bean="car2"/>
 49         </property>
 50         -->
 51         
 52         <!-- 内部bean,不能被外部引用 -->
 53         <property name="car">
 54             <bean class="me.spring.beans.Car">
 55                 <constructor-arg value="Ford"></constructor-arg>
 56                 <constructor-arg value="ChangAn"></constructor-arg>
 57                 <constructor-arg value="2354395" type="double"></constructor-arg>
 58             </bean>
 59         </property>
 60     </bean>
 61     
 62     <bean id="person2" class="me.spring.beans.Person">
 63         <constructor-arg value="Jerry"></constructor-arg>
 64         <constructor-arg value="25"></constructor-arg>
 65         <constructor-arg ref="car2"></constructor-arg>
 66 
 67         <!-- 测试赋值null -->
 68         <!--  
 69         <constructor-arg><null/></constructor-arg>
 70         -->
 71         <!-- 
 72             为级联属性赋值 
 73             注意:属性需要初始化后才可以为级联属性赋值,和Struts2不同
 74             这里必须依据person的setter和getter方法,不能为car2
 75         -->
 76         <property name="car.price" value="4546"></property>
 77     </bean>
 78     
 79     <!-- 测试如何配置集合属性 -->
 80     <bean id="person3" class="me.spring.beans.collections.Person">
 81         <property name="name" value="Mike"></property>
 82         <property name="age" value="34"></property>
 83         <property name="cars">
 84         <!-- 使用list结点为属性为list的属性赋值 -->
 85             <list>
 86                 <ref bean="car"/>
 87                 <ref bean="car2"/>
 88                 <bean class="me.spring.beans.Car">
 89                     <constructor-arg value="Ford"></constructor-arg>
 90                     <constructor-arg value="ChangAn"></constructor-arg>
 91                     <constructor-arg value="2354395" type="double"></constructor-arg>
 92                 </bean>
 93             </list>
 94         </property>
 95     </bean>
 96     <bean id="newPerson" class="me.spring.beans.collections.NewPerson">
 97         <property name="name" value="Rose"></property>
 98         <property name="age" value="23"></property>
 99         <property name="cars">
100         <!-- 使用map结点及map的entry子节点配置Map类型的成员变量 -->
101             <map>
102                 <entry key="AA" value-ref="car"></entry>
103                 <entry key="BB" value-ref="car2"></entry>
104             </map>
105         </property>
106     </bean>
107     
108     <!-- 配置properties属性值 -->
109     <bean id="dataSource" class="me.spring.beans.collections.DataSource">
110         <property name="properties">
111         <!-- 使用props和prop子节点来为properties属性值赋值 -->
112             <props>
113                 <prop key="user">root</prop>
114                 <prop key="password">123456</prop>
115                 <prop key="jdbcURL">jdbc:mysql://localhost:3306/test</prop>
116                 <prop key="driverClass">com.mysql.jdbc.Driver</prop>
117             </props>
118         </property>
119     </bean>
120     
121     <!-- 配置单例的集合bean,以供多个bean进行引用,需要导入util命名空间 -->
122     <util:list id="cars">
123         <ref bean="car"/>
124         <ref bean="car2"/>
125     </util:list>
126     
127     <bean id="person4" class="me.spring.beans.collections.Person">
128         <property name="name" value="Jack"></property>
129         <property name="age" value="34"></property>
130         <property name="cars" ref="cars"></property>
131     </bean>
132     
133     <!-- 通过p命名空间为bean的属性赋值,需要导入p命名空间,相对于传统的配置较为简洁 -->
134     <bean id="person5" class="me.spring.beans.collections.Person" p:name="Queen" p:age="45" p:cars-ref="cars"></bean>
135 </beans>
复制代码

2.相关的实体类:

(1)me.spring.beans 包下:

复制代码
  1 package me.spring.beans;
  2 
  3 public class Car {
  4 
  5     private String brand;
  6     private String corp;
  7     private double price;
  8     private int maxSpeed;
  9     public Car(String brand, String corp, double price) {
 10         super();
 11         this.brand = brand;
 12         this.corp = corp;
 13         this.price = price;
 14     }
 15     
 16     public Car(String brand, String corp, int maxSpeed) {
 17         super();
 18         this.brand = brand;
 19         this.corp = corp;
 20         this.maxSpeed = maxSpeed;
 21     }
 22 
 23     public void setPrice(double price) {
 24         this.price = price;
 25     }
 26     
 27     public double getPrice() {
 28         return price;
 29     }
 30     @Override
 31     public String toString() {
 32         return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";
 33     }
 34     
 35 }
 36 
 37 package me.spring.beans;
 38 
 39 public class Person {
 40 
 41     private String name;
 42     private int age;
 43     private Car car;
 44 
 45     public String getName() {
 46         return name;
 47     }
 48 
 49     public void setName(String name) {
 50         this.name = name;
 51     }
 52 
 53     public int getAge() {
 54         return age;
 55     }
 56 
 57     public void setAge(int age) {
 58         this.age = age;
 59     }
 60 
 61     public Car getCar() {
 62         return car;
 63     }
 64 
 65     public void setCar(Car car) {
 66         this.car = car;
 67     }
 68 
 69     public Person() {
 70         
 71     }
 72     public Person(String name, int age, Car car) {
 73         super();
 74         this.name = name;
 75         this.age = age;
 76         this.car = car;
 77     }
 78 
 79     @Override
 80     public String toString() {
 81         return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
 82     }
 83 
 84 }
 85 
 86 package me.spring.beans;
 87 
 88 public class HelloWorld {
 89 
 90     private String name;
 91     public void setName(String name) {
 92         this.name = name;
 93     }
 94     public void hello() {
 95         System.out.println("hello:" + name);
 96     }
 97 }
 98 
 99 package me.spring.beans;
100 
101 import org.springframework.context.ApplicationContext;
102 import org.springframework.context.support.ClassPathXmlApplicationContext;
103 
104 public class Main {
105 
106     public static void main(String[] args) {
107 //        HelloWorld helloWorld = new HelloWorld();
108 //        helloWorld.setName("Spring");
109 //        helloWorld.hello();
110         
111         //1.创建Spring的IOC容器对象
112         //ApplicationContext代表IOC容器
113         //ClassPathXmlApplicationContext是ApplicationContext的实现类,该实现类从类路径下加载配置文件
114         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
115         //2.从IOC容器中获取bean实例
116         //利用id定位到IOC容器中的bean
117         HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld");
118         //利用类型返回IOC容器中的bean,担忧求IOC容器中只能有一个该类型的bean
119         //HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
120         //3.调用hello方法
121         helloWorld.hello();
122         Car car = (Car) ctx.getBean("car");
123         System.out.println(car);
124         car = (Car) ctx.getBean("car2");
125         System.out.println(car);
126         Person person = (Person) ctx.getBean("person2");
127         System.out.println(person);
128     }
129     
130 }
复制代码

(2)me.spring.beans.collections 测试集和属性

复制代码
  1 package me.spring.beans.collections;
  2 
  3 import java.util.List;
  4 
  5 import me.spring.beans.Car;
  6 
  7 public class Person {
  8 
  9     private String name;
 10     private int age;
 11     
 12     private List<Car> cars;
 13 
 14     public String getName() {
 15         return name;
 16     }
 17 
 18     public void setName(String name) {
 19         this.name = name;
 20     }
 21 
 22     public int getAge() {
 23         return age;
 24     }
 25 
 26     public void setAge(int age) {
 27         this.age = age;
 28     }
 29 
 30 
 31     public Person() {
 32         
 33     }
 34 
 35     public List<Car> getCars() {
 36         return cars;
 37     }
 38 
 39     public void setCars(List<Car> cars) {
 40         this.cars = cars;
 41     }
 42 
 43     public Person(String name, int age, List<Car> cars) {
 44         super();
 45         this.name = name;
 46         this.age = age;
 47         this.cars = cars;
 48     }
 49 
 50     @Override
 51     public String toString() {
 52         return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
 53     }
 54 }
 55 
 56 package me.spring.beans.collections;
 57 
 58 import java.util.Map;
 59 
 60 import me.spring.beans.Car;
 61 
 62 public class NewPerson {
 63 
 64     private String name;
 65     private int age;
 66     private Map<String, Car> cars;
 67     public String getName() {
 68         return name;
 69     }
 70     public void setName(String name) {
 71         this.name = name;
 72     }
 73     public int getAge() {
 74         return age;
 75     }
 76     public void setAge(int age) {
 77         this.age = age;
 78     }
 79     public Map<String, Car> getCars() {
 80         return cars;
 81     }
 82     public void setCars(Map<String, Car> cars) {
 83         this.cars = cars;
 84     }
 85     
 86     public NewPerson() {
 87         // TODO Auto-generated constructor stub
 88     }
 89     public NewPerson(String name, int age, Map<String, Car> cars) {
 90         super();
 91         this.name = name;
 92         this.age = age;
 93         this.cars = cars;
 94     }
 95     @Override
 96     public String toString() {
 97         return "NewPerson [name=" + name + ", age=" + age + ", cars=" + cars + "]";
 98     }
 99     
100 }
101 
102 package me.spring.beans.collections;
103 
104 import java.util.Properties;
105 
106 public class DataSource {
107 
108     private Properties properties;
109 
110     public Properties getProperties() {
111         return properties;
112     }
113 
114     public void setProperties(Properties properties) {
115         this.properties = properties;
116     }
117 
118     @Override
119     public String toString() {
120         return "DataSource [properties=" + properties + "]";
121     }
122     
123 }
124 package me.spring.beans.collections;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
         Person person = (Person) ctx.getBean("person5");
        System.out.println(person);
         NewPerson newPerson = (NewPerson) ctx.getBean("newPerson");
        System.out.println(newPerson);
         DataSource dataSource = ctx.getBean(DataSource.class);
         System.out.println(dataSource.getProperties());
    }
}
原文地址:https://www.cnblogs.com/CaptainFM/p/10714993.html