Spring中的IOC

Spring中的IOC
IOC的概念和作用
  • 概念:

    • 控制:指代的是创建对象的过程
    • 反转:创建对象的操作原本是程序员进行的,现在反交给Spring来进行管理了
  • 作用

    • Spring中的IOC的作用就是用来创建对象的,最终的目的是实现层和层之间解耦。
IOC代码实现
  1. 首先导入jar包

    • 选中Spring的beans、core、context、expression四个核心包
    • 导入commons-logging日志包
  2. 创建applicationContext.xml文档

    • 导入xsd约束文档

    • 创建对象

    • <bean id="创建的对象名" class="com.test.pojo.对象所在的类的类名--创建的对象名所在的包下的类"></bean>
      //创建一个对象
      //例子:
      <bean id="stu" class=com.test.pojo.Student></bean>
      
  3. 在相应的实现类中/想要创建对象的地方,解析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中配置的对象就是被创建的对象,无论会不会被调用,该对象都会被执行
  4. 关于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的时候往往直接去写类,然后直接调用静态方法,传入值来创建相应的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值