首页 > 代码库 > 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等等。