一、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 环境