首页 > 代码库 > spring学习一——基本搭建,属性注入的两种方式

spring学习一——基本搭建,属性注入的两种方式

   今天用spring 3.2.5搭建了基本的环境,spring出的太快了,前段时间才3.2.5,今儿个一瞧已经上了4的版本了,稍后给出spring的jar下载地址,毕竟现在官网上找不到了啊。


   废话少说了,spring 3.2.5已经将所有的依赖包都放在了dist的lib下面,并且都有doc包和源码包,很是方便。先导入所需的jar包:core,context,beans,expression 四个jar包,除此之外,还需导入commons-logging。


   下一步,新建xml文件,建议名称为 applicationContext.xml,当然,什么名字都随意。

<?xml version="1.0" encoding="UTF-8" ?>   
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns="http://www.springframework.org/schema/beans"  
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">   
    <bean id=" " class=" ">
       <property name=" " value="http://www.mamicode.com/ ">
    </bean>
</beans>

   之所以说spring如此的方便,是因为大部分事情都帮我们做了,或许我们只需要在里面写写bean了,但正是写写这样bean,就解决了传统程序的耦合问题。为什么呢?传统程序中,一个实例A 需要另外一个实例B 作为属性,一般都是new,这也是我们不懂spring的时候的做法,然而spring中,我们只需要在xml文件中定义好bean,而实例中直接调用就ok了,为什么,因为spring会帮我注入进来,我们不需要自己去new了。这个注入就是DI,而DI就是Spring的IOC控制反转的实现方式。

   spring注入有两者方式:setter方法注入,构造方法注入。

   applicationContext.xml

<?xml version="1.0" encoding="UTF-8" ?>   
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns="http://www.springframework.org/schema/beans"  
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">   
    
    <bean id="dog" class="com.xj.bean.Dog">
        <property name="name" value="http://www.mamicode.com/judy"/>
    </bean>
</beans>

  

实体类Dog.java

package com.xj.bean;

public class Dog {
   private String name;

public String getName() {
	return name;
}

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

测试类:

public class TestApplicationEvent {
    public static void main(String[] args) {
    	ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Dog dog = (Dog)applicationContext.getBean("dog");
		System.out.println(dog.getName());
    }
}

结果:judy

  上面所用的方法则是setter方法注入,所以此种方法要求实体bean一定的属性一定要有set方法


构造方法注入:

applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>   
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns="http://www.springframework.org/schema/beans"  
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">   
   
     <bean id="cat" class="com.xj.bean.Cat">
         <constructor-arg value="http://www.mamicode.com/andy"/>
          <constructor-arg value="http://www.mamicode.com/12"/>
    </bean>
   
</beans>

实体类Cat.java

 

package com.xj.bean;

public class Cat {
	public String name;
	public String age;
     public Cat(String name,String age){
    	 this.name = name;
    	 this.age = age;
     }
     
}
//这里故意不放setter方法,是为了与setter

测试类:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");	
		Cat cat = (Cat)applicationContext.getBean("cat");
		System.out.println(cat.name);
		System.out.println(cat.age);

结果:andy 

      12


可以看出setter方法和构造方法都能达到DI注入的效果,但是推荐用setter方法,

 程序创建spring的容器applicationContext时候,就会实例化所有singleTon的bean,实例化bean时,

 1.setter方法注入:先调用空的构造方法,在调用setter方法设置属性

2.构造方法注入:调用构造方法时,同时设置属性

大家想想,第2种方法该有多慢。但是第2种也有好处,可以手动设置属性加载的顺序,必须先需要加载datasource等等。