Spring4.1.4 bean的加载与赋值

来源:互联网 发布:win10关闭网络唤醒 编辑:程序博客网 时间:2024/06/10 20:37
既然是学习,那么我们就从spring的基础开始。对于本篇了解了的朋友可以提提意见,不了解的朋友就顺带着写写代码,感受一下实现的快感。

定义javabean

这个bean里面我们定义了name、age和hobby三个属性。

并定义了四个构造方法,在下面讲解的时候会一一说到。
 

  1. package com.itxxz.user.bean;  
  2.   
  3. /** 
  4.  * 用户类 
  5.  *  
  6.  * @author IT学习者-螃蟹 
  7.  * @url www.itxxz.com 
  8.  * 
  9.  */  
  10. public class UserInfo {  
  11.       
  12.     public UserInfo(){  
  13.         System.out.println("Construction ...");  
  14.         System.out.println(toString());  
  15.     }  
  16.       
  17.     public UserInfo(String name){  
  18.         this.name = name;  
  19.         System.out.println("Construction one...");  
  20.         System.out.println(toString());  
  21.     }  
  22.       
  23.     public UserInfo(String name,String hobby,int age) {  
  24.         this.name = name;  
  25.         this.age = age;  
  26.         this.hobby = hobby;  
  27.         System.out.println("Construction two...");  
  28.         System.out.println(toString());  
  29.     }  
  30.       
  31.     public UserInfo(String name, int age, String hobby) {  
  32.         this.name = name;  
  33.         this.age = age;  
  34.         this.hobby = hobby;  
  35.         System.out.println("Construction three...");  
  36.         System.out.println(toString());  
  37.     }  
  38.       
  39.     public void say(){  
  40.         System.out.println("hello,我是"+name);  
  41.     }  
  42.   
  43.   
  44.     private String name;  
  45.       
  46.     private int age;  
  47.       
  48.     private String hobby;  
  49.       
  50.     public String getName() {  
  51.         return name;  
  52.     }  
  53.     public void setName(String name) {  
  54.         this.name = name;  
  55.     }  
  56.     public int getAge() {  
  57.         return age;  
  58.     }  
  59.     public void setAge(int age) {  
  60.         this.age = age;  
  61.     }  
  62.   
  63.     public String getHobby() {  
  64.         return hobby;  
  65.     }  
  66.   
  67.     public void setHobby(String hobby) {  
  68.         this.hobby = hobby;  
  69.     }  
  70.   
  71.     @Override  
  72.     public String toString() {  
  73.         return "UserInfo [name=" + name + ", age=" + age + ", hobby=" + hobby  
  74.                 + "]";  
  75.     }  
  76.       
  77. }  

配置bean文件

比如我们要创建一个实体类,通常的做法是new一个,这里springICO容器
给我们提供了另一种方法。

  1. <!-- 定义一个bean类 -->  
  2. <bean id="userid" class="com.itxxz.user.bean.UserInfo">  
  3.     <property name="name" value="IT学习者"></property>  
  4.     <property name="age" value="20"></property>  
  5. </bean>  

这里id是唯一标识,class是指我们的加载类。在项目启动的时候就会默认加载这个bean,并将存放于springICO容器中,实现原理课参考:Spring4.1.4 ioc原理》。

需要注意的是,如果调用该bean,在UserInfo中必须包含一个无参构造方法

这样在调用的时候,便可以用
ApplicationContext 通过bean的id来获取对应的对象了。

代码如下:


  1. package com.itxxz.test;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. import com.itxxz.user.bean.UserInfo;  
  7.   
  8. /** 
  9.  *  
  10.  * @author IT学习者-螃蟹 
  11.  *  
  12.  * @url www.itxxz.com 
  13.  * 
  14.  */  
  15. public class HelloWorld {  
  16.   
  17.     public static void main(String[] args) {  
  18.         ApplicationContext act = new ClassPathXmlApplicationContext(  
  19.                 "applicationContext.xml");  
  20.         System.err.println("----获取userbean----");  
  21.         UserInfo user = (UserInfo)act.getBean("userid");  
  22.         System.out.println(user.getName());  
  23.         user.say();  
  24.   
  25.     }  
  26.   
  27. }
官网:http://www.itxxz.com 

我们在bean中给name和age分别赋值,这就相当于调用了setter方法,

打印结果:



以上的例子只是调用无参构造方法,那么如何调用自己定义的构造方法呢?


  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.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  5.   
  6.     <!-- 定义一个bean类 -->  
  7.     <bean id="userid" class="com.itxxz.user.bean.UserInfo">  
  8.         <property name="name" value="IT学习者"></property>  
  9.         <property name="age" value="20"></property>  
  10.     </bean>  
  11.       
  12.     <!-- 构造方法一 -->  
  13.     <bean id="userOne" class="com.itxxz.user.bean.UserInfo">  
  14.         <constructor-arg value="IT学习者" index="0"></constructor-arg>  
  15.     </bean>  
  16.       
  17.     <!-- 构造方法二 -->  
  18.     <bean id="usertwo" class="com.itxxz.user.bean.UserInfo">  
  19.         <constructor-arg value="螃蟹" index="0"></constructor-arg>  
  20.         <constructor-arg value="篮球" index="1"></constructor-arg>  
  21.         <constructor-arg value="18" index="2"></constructor-arg>  
  22.     </bean>  
  23.       
  24.     <!-- 构造方法三 -->  
  25.     <bean id="userThree" class="com.itxxz.user.bean.UserInfo">  
  26.         <constructor-arg value="青鸟" index="0"></constructor-arg>  
  27.         <constructor-arg value="22" index="1"></constructor-arg>  
  28.         <constructor-arg value="足球" index="2"></constructor-arg>  
  29.     </bean>  
  30.   
  31. </beans>  

如上所示,我们自己定义了三个构造方法,第一个只有name属性,第二个和第三个参数及类型相同,只是age和hobby的顺序变换了一下。

这里的constructor可以理解为就是构造参数,value是对应的参数的值,index是指的第几个参数,从0开始

这样我们再运行一下,看看效果




从结果中可以看到我们对构造方法中参数的赋值生效了。

然而很有意思的事情也发生了,我们用的依然是HelloWorld中的代码,只是获取了一个UserInfo的实例,并没有调用其它构造方法,可是如上图所示,无参的构造方法和自定义的三个有参构造方法均在 
UserInfo user = (UserInfo)act.getBean("userid");   前执行了。 内容来自www.itxxz.com 

其实,springICO容器的设计思想就是,项目在初始化的时候,会将所有的bean存放到内存中(HashMap),bean的id就是key,value就是这个bean,以后的对象 调用就由spring自行管理了。

http://www.itxxz.com/a/gaoji/2015/0120/spring_bean.html

1 0
原创粉丝点击