Spring的属性注入

Spring的属性注入有三种:

  • set方法注入
  • 构造函数注入
  •  p名称控件注入
  •   spel注入

只用掌握set方法和构造方法注入即可

1.set方法注入

   基本类型注入

1 <bean name="user" class="entity.User" >
2         <!--为user对象中名为name的属性注入值为tom-->
3         <property name="name" value="tom"></property>
4         <property name="age" value="28"></property>
5     </bean>

测试类

 1 package injection;
 2 
 3 import entity.User;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6 
 7 public class DemoTest {
 8     @org.junit.Test
 9     public void fun1() throws Exception {
10 
11         //1、创建容器对象,从类路径下去加载xml的配置文件
12         ApplicationContext ac=new ClassPathXmlApplicationContext("\\injection\\applicationContext.xml");
13         //想容器要对象
14         User u=(User) ac.getBean("user");
15         System.out.println(u);
16 
17     }
18 
19 }

输出为

 

引用类型注入

测试类

 1 package entity;
 2 
 3 public class User {
 4     private String name;
 5     private Integer age;
 6     private Car car;
 7 
 8     public Car getCar() {
 9         return car;
10     }
11 
12     public void setCar(Car car) {
13         this.car = car;
14     }
15 
16 
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public Integer getAge() {
27         return age;
28     }
29 
30     public void setAge(Integer age) {
31         this.age = age;
32     }
33 
34     public void init(){
35         System.out.println("初始化方法");
36     }
37     public void destroy(){
38         System.out.println("销毁方法");
39     }
40 
41     @Override
42     public String toString() {
43         return "User{" +
44                 "name='" + name + '\'' +
45                 ", age=" + age +
46                 ", car=" + car +
47                 '}';
48     }
49 }

User类中含有引用类型的对象Car,Car实体类为

 1 package entity;
 2 
 3 public class Car {
 4     private String color;
 5     private String name;
 6 
 7     public String getColor() {
 8         return color;
 9     }
10 
11     public void setColor(String color) {
12         this.color = color;
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     @Override
24     public String toString() {
25         return "Car{" +
26                 "color='" + color + '\'' +
27                 ", name='" + name + '\'' +
28                 '}';
29     }
30 }

配置文件中User的配置为 1 <bean name="user" class="entity.User" >

 2         <!--为user对象中名为name的属性注入值为tom-->
 3         <property name="name" value="tom"></property>
 4         <property name="age" value="28"></property>
<!--通过ref配置引用类型--> 5 <property name="car" ref="car"></property> 6 </bean> 7 8 9 <bean name="car" class="entity.Car"> 10 <property name="name" value="benchi"></property> 11 <property name="color" value="black"></property> 12 </bean>

先配置Car对象,再通过ref将Car类对象配置入User对象中。

测试类

 1 package injection;
 2 
 3 import entity.User;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6 
 7 public class DemoTest {
 8     @org.junit.Test
 9     public void fun1() throws Exception {
10 
11         //1、创建容器对象,从类路径下去加载xml的配置文件
12         ApplicationContext ac=new ClassPathXmlApplicationContext("\\injection\\applicationContext.xml");
13         //想容器要对象
14         User u=(User) ac.getBean("user");
15         System.out.println(u);
16 
17     }
18 
19 }

 

2、构造函数注入

首先需要有带有参数的构造方法,为User创建带有参数name和car的构造方法

package entity;

public class User {
    private String name;
    private Integer age;
    private Car car;

    public User() {
    }

    public User(String name, Car car) {
        System.out.println("User(String name, Car car)");
        this.name = name;
        this.car = car;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void init(){
        System.out.println("初始化方法");
    }
    public void destroy(){
        System.out.println("销毁方法");
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", car=" + car +
                '}';
    }
}
package entity;

public class Car {
    private String color;
    private String name;

    public Car() {

    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Car(String color, String name) {
        System.out.println("+Car(String color, String name)");
        this.color = color;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Car{" +
                "color='" + color + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

为Car创建带有参数的构造方法,配置文件如下:

1 <bean name="car" class="entity.Car">
2         <property name="name" value="benchi"></property>
3         <property name="color" value="black"></property>
4     </bean>
5 
6     <bean name="user2" class="entity.User">
7         <constructor-arg name="name" value="guojerry" index="0" type="java.lang.String"></constructor-arg>
8         <constructor-arg name="car" ref="car" index="1"></constructor-arg>
9     </bean>

使用construct-arg标签进行配置,index指明改参数的次序即是作为构造函数的第几个参数,type指明的是改参数的类型,当一个实体类中有多个构造方法时可通过index和type指定某个构造方法。

posted @ 2017-12-04 15:32  Garcia11  阅读(208)  评论(0)    收藏  举报