Spring part 1:IoC和DI

 

 

 

 

 

 

一、IoC

导入所需要的jar包

com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
spring-beans-3.2.5.RELEASE.jar
spring-context-3.2.5.RELEASE.jar
spring-core-3.2.5.RELEASE.jar
spring-expression-3.2.5.RELEASE.jar

 创建一个实例对象

public class InstanceBean {
	public InstanceBean() {
		System.out.println("...");
	}

	public void method() {
		System.out.println("InstanceBean--method()");
	}
}

 在src下创建applicationContext.xml,配置如下

<bean id="instance" class="demo01.InstanceBean"></bean>

使用IoC的方式为其初始化,Spring会通过id属性读取配置文件,通过反射为类进行初始化

	@Test
	public void demo1(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		InstanceBean bean = (InstanceBean) applicationContext.getBean("instance");
		bean.method();
	}

 创建对象的权利被反转给了Spring

 

二、DI

当一个对象的创建依赖于另外一个对象时,依赖就发生了,Spring的依赖是方法级的与对象中的属性无关

	class A {
		void setName(String name){
			// 就可以说 A 对象 依赖 String 类型参数
		}
		void setB(B b){
		    // 就可以说 A 对象 依赖 B 类型参数 
		}
	}

 实例bean,可以没有info属性,但必须有setXxxx()

public class InstanceBean {
	private String info;

	public InstanceBean() {
		System.out.println("...");
	}

	public void method() {
		System.out.println("InstanceBean--method()");
	}

	public String getInfo() {
		return this.info;
	}

	public void setInfo(String info) {
		this.info = info;
	}

}

 配置

<bean id="instance" class="demo01.InstanceBean">
		<property name="info" value="注入"></property>
	</bean>

 通过DI的方式为InstanceBean注入String类型对象

	@Test
	public void demo2(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		InstanceBean bean = (InstanceBean) applicationContext.getBean("instance");
		System.out.println(bean.getInfo());
	}

 这种对象间的依赖关系,通过Spring的使用配置文件的方式注入到InstanceBean中

 

三、Spring配置文件读取

一般有两个位置:

1、src根目录

2、WEB-INF下

最好命名为applicationContext.xml

读取方式

加载classpath:
	ew ClassPathXmlApplicationContext("applicationContext.xml");
加载磁盘路径:
	FileSystemXmlApplicationContext("WebContent/WEB-INF/applicationContext.xml");

 

 四、Spring实例化Bean的三种方式

1、使用构造器

实例化对象必须提供默认构造方法,配置如下

<bean id="instance" class="demo01.InstanceBean"></bean>

实例化

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
InstanceBean bean = applicationContext.getBean("instance",InstanceBean.class);

2、静态工厂方法

工厂类

public class BeanFactory {
	public static InstanceBean getInstanceBean() {
		return new InstanceBean();
	}
}

 配置

<bean id="instance1" class="demo01.BeanFactory" factory-method="getInstanceBean">
		<property name="info" value="静态工厂注入"></property>
	</bean>

实例化

	ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		InstanceBean bean =  applicationContext.getBean("instance1",InstanceBean.class);

 3、实力工厂

工厂

public class BeanFactory {
	public  InstanceBean getInstanceBeen() {
		return new InstanceBean();
	}
}

配置

<bean id="beanFactory"  class="demo01.BeanFactory"></bean>
	<bean id="instance2"  factory-bean="beanFactory" factory-method="getInstanceBeen">
		<property name="info" value="实例工厂注入"></property>
	</bean>

 实例化

		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		InstanceBean bean =  applicationContext.getBean("instance2",InstanceBean.class);
		System.out.println(bean.getInfo());

 

 五、Spring中Bean的作用域

Spring加载配置文件时,会默认为文件中所配置的所有bean实例化,实例化后,默认bean的实例为单利模式

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		InstanceBean bean1 =  applicationContext.getBean("instance",InstanceBean.class);
		InstanceBean bean2 =  applicationContext.getBean("instance",InstanceBean.class);
		System.out.println(bean1);
		System.out.println(bean2);

 还有其他几种类型

1、singleton

在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在

2、prototype

每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean()

2、request

每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境

3、session

同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext 环境

4、globalSession

一般用于Porlet应用环境,该作用域仅适用于WebApplicationContext 环境

 

 

 

 

 

 

 

 

你可能感兴趣的:(Spring part 1:IoC和DI)