为了账号安全,请及时绑定邮箱和手机立即绑定

Spring深入浅出(一)IOC的基本知识

标签:
Java

Spring前言

Spring是一个企业级开发框架,为解决企业级项目开发过于复杂而创建的,框架的主要优势之一就是分层架构,允许开发者自主选择组件。

Spring的两大核心机制是IOC(控制反转)和AOP(面向切面编程),从开发的角度讲,我们使用Spring框架就是用它的IOCAOP

 

IOC是典型的工厂模式,通过工厂去注入对象。

AOP则是代理模式的体现

 

IOC控制反转

IOC也叫控制反转,首先从字面意思理解,什么叫控制反转?反转的是什么?

在传统的程序开发中,需要调用对象时,通常由调用者来创建被调用者的实例,即对象是由调用者主动使用new关键字出来的。

但在Spring框架中创建对象的工作不再由调用者来完成,而是交给IOC容器来创建,再推送给调用者,整个流程完成反转,所以是控制反转。也就是

 

例如:买礼品。

传统方式:你去礼品店,需要自己去挑,然后自己带回来。

IOC:你只需要把需要的东西的清单放在家门口,然后就像圣诞老人一样将礼物放到你们的门口,你可以直接拿到用就行。

 

IOC的代码描述与解释

通过传统方式创建并且实例化一个对象

1.传统模式去生成一个人的对象,有属性和set/get方法

复制代码

public class Person {    private int id;    private String name;    public int getId() {        return id;
    }    public void setId(int id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }
}

复制代码

 

2.在测试方法中去实例化Person对象

复制代码

public class Test {    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p);
    }
}

复制代码

 通过Spring的方式去创建并且实例化一个对象

准备工作:

1.添加Spring相关jar包。

2.创建配置文件,可以自定义文件名applicationContext.xml。

3.调用API。

复制代码

<?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">

     <!-- 配置Person对象-->
    <!-- 
      1.id:对象名。
      2.class:实体类的全路径名
    -->

     <bean id="p" class="com.test.entity.Person"></bean></beans>

复制代码

 

复制代码

public class Test {    public static void main(String[] args) {        //1.加载spring的配置文件,生成ApplicationContext对象。
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");        //2.调用ApplicationContext的getBean方法获取对象,通过在配置文件中的bean的id值获取对象
        Person p = (Student) applicationContext.getBean("p");
        System.out.println(p);
    }
}

复制代码

 

   程序在加载spring的配置文件的时候创建person对象,通过反射机制调用无参构造函数,所以要求交给IOC容器管理的类必须有无参构造函数。此时的person对象的属性全部为空,因为调用无参构造只会创建对象而不会进行赋值,如何赋值呢?

给实体类赋初始值(无参构造的方式)

添加property标签:name对应实体类中的属性名,value是需要赋予属性的初始值。可以在property标签中使用其属性名,也可以在property中使用value标签

注意:   (1)若包含特殊字符,比如  name="<ZhangSan>",需要使用<![CDATA[<ZhangSan>]]>进行配置。

    (2)Spring是通过调用每个属性的setter方法来完成属性的赋值。所以实体类必须有setter方法,否则加载时报错,getter方法可写可不写。

 

复制代码

<?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">

     <!-- 配置Person对象-->    <!--       1.id:对象名。
      2.class:实体类的全路径名
    -->

     <bean id="p" class="com.test.entity.Person">
        <property name="id" value="1"></property>
        <property name="name">
            <value><![CDATA[<ZhangSan>]]></value>
        </property>
        <property name="name" value="zhangsan"></property>
    </bean></beans>

复制代码

 调用方法与上面一样,就不再描述了。需要注意的如下:

复制代码

//1、第一种方式,使用配置文件中的id,这也是最常用的方式Person p = (Student) applicationContext.getBean("p");//2、第二种方式,直接使用类名,但是如果在配置文件中有两个bean都是由Student类生成的,IOC容器无法将两个bean都返回,必须指定一个唯一的bean。因此不推荐使用Person p = (Student) applicationContext.getBean(Person.class);

复制代码

 

给实体类赋初始值(有参构造的方式)

1.创建一个实体类

2.在配置文件中的属性写法

3.实例化

复制代码

//实体类public class Person {    private int id;    private String name;    public int getId() {        return id;
    }    public void setId(int id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    public Person(int id, String name,) {        super();        this.id = id;        this.name = name;
    }
}

复制代码

 

复制代码

<?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">

     <!-- 通过有参构造函数创建对象 -->

    <!-- 
            1.此时IOC容器会根据constructor-arg标签去加载对应的有参构造函数,创建对象并完成属性赋值。
                      name的值需要与有参构造的形参名对应,value是对应的值。     -->
     <bean id="p" class="com.test.entity.Person">
        <constructor-arg name="id" value="1"></constructor-arg>
        <constructor-arg name="name" value="ZhangSan"></constructor-arg>
     </bean>

    <!-- 
        2.除了使用name对应参数外,还可以通过下标index对应。 
               index的值必须和实体类中的顺序一一对应    -->
     <bean id="p2" class="com.test.entity.Person">
        <constructor-arg index="0" value="2"></constructor-arg>
        <constructor-arg index="2" value="LiSi">    </constructor-arg>
     </bean></beans>

复制代码

 

IOC容器管理多个对象 

复制代码

//创建一个班级类public class Classes {    private int id;    private String name;    public int getId() {        return id;
    }    public void setId(int id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }
}//创建一个学生类public class Student {    private int id;    private String name;    private Classes classes;    public Classes getClasses() {        return classes;
    }    public void setClasses(Classes classes) {        this.classes = classes;
    }    public int getId() {        return id;
    }    public void setId(int id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }

}

复制代码

<?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">

     <!-- 创建classes对象 -->
     <bean id="classes" class="com.hzit.entity.Classes">
        <property name="id" value="1"></property>
        <property name="name" value="Java班"></property>
     </bean>

     <!-- 创建stu对象 -->
     <bean id="stu" class="com.hzit.entity.Student">
        <property name="id" value="1"></property>
        <property name="name" value="zhangsan"></property>
        <!-- 将classes对象赋给stu对象   使用ref标签(引用)-->
        <property name="classes" ref="classes"></property>
     </bean></beans>

复制代码

复制代码

   在spring的配置文件中,通过ref属性将其他bean赋给当前bean对象,这种方式叫做依赖注入(DI),DI也是Spring中IOC的重要一环,所以一般说的IOC包括DI。

在实体类中包含Array,List,Map的赋值

复制代码

public class Classes {    private int id;    private String name;    private List<Student> students;    public List<Student> getStudents() {        return students;
    }    public void setStudents(List<Student> students) {        this.students = students;
    }    public int getId() {        return id;
    }    public void setId(int id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }
}

复制代码

复制代码

<?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">

     <!-- 配置classes对象 -->
     <bean id="classes" class="com.hzit.entity.Classes">
        <property name="id" value="1"></property>
        <property name="name" value="Java班"></property>
        <property name="students">
            <!-- 注入student对象 -->
            <list>
                <ref bean="stu"/>
                <ref bean="stu2"/>
            </list>
        </property>
     </bean>

     <bean id="stu" class="com.hzit.entity.Student">
        <property name="id" value="1"></property>
        <property name="name" value="Zhangsan"></property>
     </bean>

     <bean id="stu2" class="com.hzit.entity.Student">
        <property name="id" value="2"></property>
        <property name="name" value="LiSi"></property>
     </bean></beans>

复制代码

 

上述描述了集合属性通过list标签和ref标签完成注入(数组与list一样)。

ref的bean属性指向需要注入的bean对象。

Set,Map,Properties等集合的方式与list相同,只是标签不同,分别是<set></set>,<map></map>,<props></props>

总结

IOC是Spring的核心,很重要。使用Spring开发项目时,控制层,业务层,DAO层都是通过IOC来完成依赖注入(DI)的。

原文出处:https://www.cnblogs.com/JiangLai/p/9561435.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消