Spring中的IOC
IOC的概念和作用
-
概念:
- 控制:指代的是创建对象的过程
- 反转:创建对象的操作原本是程序员进行的,现在反交给Spring来进行管理了
-
作用
- Spring中的IOC的作用就是用来创建对象的,最终的目的是实现层和层之间解耦。
IOC代码实现
-
首先导入jar包
- 选中Spring的beans、core、context、expression四个核心包
- 导入commons-logging日志包
-
创建applicationContext.xml文档
-
导入xsd约束文档
-
创建对象
-
<bean id="创建的对象名" class="com.test.pojo.对象所在的类的类名--创建的对象名所在的包下的类"></bean> //创建一个对象 //例子: <bean id="stu" class=com.test.pojo.Student></bean>
-
-
在相应的实现类中/想要创建对象的地方,解析xml文档,获取对象
public class TestA{ public static void main(String[] args){ //解析xml文件 ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取对象 app.getBean("xml中创建的对象的对象名",xml中创建的对象所在的类.class).var; } } //例子: public class TestA{ public static void main(String[] args){ ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml"); app.getBean("stu",Student.class).var } }
- 这里关于对象的步骤是获取对象的步骤,也就是说,对象早就已经被创建完成了,这里仅仅是做了调用的步骤。如果我们之前在实现类中定义了构造函数中有输出语句的话,那么我们可以不获取对象就运行程序,这样是可以看见该构造函数中的输出语句的,就因为创建对象的过程是xml创建的跟获取对象无关。
- xml中配置的对象就是被创建的对象,无论会不会被调用,该对象都会被执行
-
关于IOC的三种创建方式
-
无参构造方法
-
在pojo的实现类中定义无参构造方法
-
在xml文件中配置
<bean id="对象名" class="com.test.pojo.实体类"></bean>
-
-
有参构造方法
-
在pojo的实现类中定义有参构造方法
-
在xml文件中配置
<bean id="对象名" class="com.test.pojo.实体类"> <constructor-args name="有参构造中的形参名" value="实际传入的值" index="形参的具体下标" type="参数的类型(基本数据类型直接用,string要写java.lang.String)"></constructor-args> </bean> //例子 //实体类 public User(String Sex, String sname){ this.sex=sex; this.name=sname; } <bean id="stu" class="com.test.pojo.实体类"> <constructor-args name="sname" value="zhangsan" index="1" type="int"></constructor-args></bean>
-
-
通过工厂模式
-
创建一个能够使用该工厂创建对象的公共的规则(接口)
public interface People{ public void eat(); public void run(); }
-
创建两个继承该接口的实体类
public class Student implements People{ @Override public void eat(){ System.out.println("学生eat方法"); } @Override public void run(){ System.out.println("学生run方法"); } }
public class Teacher implements People{ @Override public void eat(){ System.out.println("老师eat方法"); } @Override public void run(){ System.out.println("老师run方法"); } }
-
创建一个工厂模式的类
public class FactoryA{ public People getInstance(String param){ if("tea".equals(param)){ return new Teacher(); }else if("stu".equals(param)){ return new Student(); }else{ return null; } } }
<bean id="factory(一般来说是factory)" class="com.test.pojo.FactoryA(这个类就是创建的工厂类)"></bean> <bean id="people(一般是接口类的名字)" factory-bean="factory" factory-method="工厂中创建对象的方法"> <constructor-arg name="工厂中创建对象的方法传入的参数名称" value="实际传入的值"></constructor-arg> </bean> //例子: <bean id="factory(一般来说是factory)" class="com.text.pojo.FactoryA(这个类就是创建的工厂类)"></bean> <bean id="people(一般是接口类的名字)" factory-bean="factory" factory-method="getInstance"> <constructor-arg name="param" value="stu"></constructor-arg> </bean>
-
-
静态工厂模式
-
将工厂模式的类的方法改为静态方法
public class FactoryA{ public static People getInstance(String param){ if("tea".equals(param)){ return new Teacher(); }else if("stu".equals(param)){ return new Student(); }else{ return null; } } }
-
在xml中书写创建的对象
<bean id="接口的类名" class="com.test.pojo.FactoryA(这个类就是创建的工厂类)" factory-method="静态工厂类中定义的方法名"> <constructor-arg name="静态工厂中创建的对象的方法中传入的参数的名称" value="实际传入的值"></constructor-arg> </bean> //例子 <bean id="people" class="com.test.pojo.FactoryA(这个类就是创建的工厂类)" factory-method="getInstance"> <constructor-arg name="param" value="stu"></constructor-arg> </bean>
-
要注意的是在使用静态工厂创建对象的时候实际上执行的是
People stu=FactoryA.getInstance("stu");
所以说我们在配置xml的时候往往直接去写类,然后直接调用静态方法,传入值来创建相应的对象
-
-