IOC(控制反转)
控制反转(IOC):以前传统的java开发模式中,当需要一个对象时我们,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象,而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。实例化一个java对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法,当使用spring时我们就不需要关心通过何种方式实例化一个对象,spring通过控制反转机制自动为我们实例化一个对象。
简单的说,控制反转就是将对象的创建由之前的new创建,交给Spring进行管理。
Bean实例化的3中方式:
项目结构如下:
1、使用类构造器(无参构造器)(常用,重点掌握)
在applicationContext.xml配置文件中配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- id为唯一标识 class标识要实例化的对象 -->
<bean id="beanOne" class="com.gxj.two.BeanOne" ></bean>
</beans>
实例化对象:
package com.gxj.two;
public class BeanOne {
public void add(){
System.out.println("岁月如歌!");
}
}
测试:
package com.gxj.two;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanOneTest {
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("com/gxj/two/applicationContext.xml");
BeanOne beanOne = (BeanOne) context.getBean("beanOne");
beanOne.add();
}
}
输出结果:
2、使用静态工厂创建(了解)
在applicationContext.xml配置文件中配置:
<bean id="beanTwo" class="com.gxj.two.BeanTwoFactory" factory-method="getBeanTwo"></bean>
静态工厂类:
package com.gxj.two;
public class BeanTwoFactory {
public static BeanTwo getBeanTwo() {
System.out.println("岁月如歌!");
return new BeanTwo();
}
}
实例化对象:
package com.gxj.two;
public class BeanTwo {
public void add() {
System.out.println("时光静好!");
}
}
测试:
package com.gxj.two;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanTwoTest {
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("com/gxj/two/applicationContext.xml");
BeanTwo beanTwo = (BeanTwo) context.getBean("beanTwo");
beanTwo.add();
}
}
注意:使用静态工厂创建对象时,在工厂中静态方法的static不能省略。配置文件中的factory-method的属性值跟静态方法的方法名一致。
3、使用实例工厂进行创建(了解):
将对象的创建交给工厂类,跟静态工厂创建是类似的,但是配置不同
在applicationContext.xml配置文件中配置:
<!-- 利用实例工厂创建对象 要先创建工厂对象 注:工厂的id和factory-bean的值一致。-->
<bean id="BeanFactory" class="com.gxj.two.BeanThreeFactory"></bean>
<bean id="beanThree" factory-bean="BeanFactory" factory-method="getBeanThree"></bean>
实例工厂类:
package com.gxj.two;
public class BeanThreeFactory {
public BeanThree getBeanThree() {
System.out.println("明日待明日,明日何其多。");
return new BeanThree();
}
}
实例对象:
package com.gxj.two;
public class BeanThree {
public void add() {
System.out.println("我生待明日,万事成蹉跎!");
}
}
测试:
package com.gxj.two;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanThreeTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("com/gxj/two/applicationContext.xml");
BeanThree beanThree = (BeanThree) context.getBean("beanThree");
beanThree.add();
}
}
结果:
bean标签的常用属性:
id:起名称,id属性值名称任意命名,但是不能包含特殊符号,且必须唯一
class:要实例的对象所在类的全路径
name:用的少,功能和id一样,name属性可以包含特殊符号。
scope:bean的作用范围 ,设置单例或者多例。
singleton:单例(只能创建一个对象,默认),多次创建使用同一个地址,也就是说创建的是同一个对象。
prototype:多例,多次创建,创建的是多个对象。