Spring入门(二)Spring的IOC

前言

      通过前面的简介我们知道了Spring的大致作用,本章将讲解它的第一个功能,IOC

方法

1.概念

IOC的英文名称:Inversion of Control

IOC的中文名称:控制反转

作用:在使用Spring以前,我们创建对象基本上由我们程序员自行的手动“new”一个对象出来,控制反转的概念就是将创建对象的操作交给我们的Spring,由他来管理对象。也就是说,控制的是控制类的对象,反转是交给Spring来负责!

2.Spring的基本环境配置

1)导入相应jar包

由于我们学过了Maven,这里就无需自己导jar了,直接在pom.xml中进行相关配置:

我们知道,最基本的四个包需要导入:Beans,Core,Context,SpEL

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.1.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.1.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.1.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</artifactId>
  <version>4.1.6.RELEASE</version>
</dependency>

2)配置Spring配置文件:

官方给出的配置文件名称为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">
    
</beans>

3)在applicationContext.xml中配置bean

既然我们把对象的创建过程交给了Spring来做,那么我们要让Spring知道需要创建哪些对象。所以将使用该配置文件进行配置!

示例:使用bean标签创建User对象

<?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">
    <!-- 使用bean标签创建对象,id代表用于标识对象,class指定对象的路径 -->
    <bean id="user" class="cn.edu.ccut.bo.User"></bean>
</beans>

4)配置测试类加载XML并取得User对象

import cn.edu.ccut.bo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    @Test
    public void testApplicationContext(){
        //加载spring配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取User对象
        User user = ac.getBean("user", User.class);
        System.out.println(user);
    }
}

观察打印的结果:

这就证明了Spring已经帮助我们创建好了相关的对象。

这里可能你会觉得直接new出来不是比这个要简单?不要急,我们之后将知道它的好处,这里只是简单讲解。

3.Spring创建bean的三种方式

1)构造方法

  • 无参构造方法(默认):我们上面的例子就属于调用了无参的构造方法创建的User对象

我们在构造方法中添加以下语句进行验证:

再次执行上面的测试方法:

  • 有参构造方法

在配置文件中进行如下配置:

<?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">
    <!-- 使用bean标签创建对象,id代表用于标识对象,class指定对象的路径 -->
    <bean id="user" class="cn.edu.ccut.bo.User">
        <!-- 使用constructor-arg标签进行有参构造创建bean-->
        <!-- index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 -->
        <!-- value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean -->
        <constructor-arg index="0" value="admin"></constructor-arg>
        <constructor-arg index="1" value="admin"></constructor-arg>
    </bean>
</beans>

运行之前的测试方法看一下效果:

2)实例工厂

该方式利用的是工厂设计模式。

创建对应工厂类:UserFactory.java

package cn.edu.ccut.factory;

import cn.edu.ccut.bo.User;

public class UserFactory {

    public User newInstance(){
        return new User();
    }
}

对配置文件进行如下配置:

<?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">
    <!-- 使用bean标签创建对象,id代表用于标识对象,class指定对象的路径 -->
    <!--<bean id="user" class="cn.edu.ccut.bo.User">
        &lt;!&ndash; 使用constructor-arg标签进行有参构造创建bean&ndash;&gt;
        &lt;!&ndash; index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 &ndash;&gt;
        &lt;!&ndash; value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean &ndash;&gt;
        <constructor-arg index="0" value="admin"></constructor-arg>
        <constructor-arg index="1" value="admin"></constructor-arg>
    </bean>-->
    <!-- 创建工厂类的bean -->
    <bean id="userFactory" class="cn.edu.ccut.factory.UserFactory"/>
    <!-- factory-bean代表工厂的bean,factory-method代表工厂方法 -->
    <bean id="user" factory-bean="userFactory" factory-method="newInstance"></bean>
</beans>

运行测试类查看效果:

3)静态工厂

 创建对应工厂类:UserFactory.java

package cn.edu.ccut.factory;

import cn.edu.ccut.bo.User;

public class UserFactory {

    public static User newInstance(){
        return new User();
    }
}

对配置文件进行如下配置:

<?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">
    <!-- 使用bean标签创建对象,id代表用于标识对象,class指定对象的路径 -->
    <!--<bean id="user" class="cn.edu.ccut.bo.User">
        &lt;!&ndash; 使用constructor-arg标签进行有参构造创建bean&ndash;&gt;
        &lt;!&ndash; index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 &ndash;&gt;
        &lt;!&ndash; value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean &ndash;&gt;
        <constructor-arg index="0" value="admin"></constructor-arg>
        <constructor-arg index="1" value="admin"></constructor-arg>
    </bean>-->
    <!--&lt;!&ndash; 创建工厂类的bean &ndash;&gt;
    <bean id="userFactory" class="cn.edu.ccut.factory.UserFactory"/>
    &lt;!&ndash; factory-bean代表工厂的bean,factory-method代表工厂方法 &ndash;&gt;
    <bean id="user" factory-bean="userFactory" factory-method="newInstance"></bean>-->
    <!-- class表示工厂类型 factory-method代表工厂方法 -->
    <bean id="user" class="cn.edu.ccut.factory.UserFactory" factory-method="newInstance"></bean>
</beans>

运行测试类查看效果:

附录:

1.scope属性

<bean>标签存在一个scope属性,该属性定义了该对象的有效范围(单例、多例等)

目前在没有学习SpringMVC的条件下,其有两个可选值:

  • singleton:默认值,单例
  • prototype:多例,每次获取需要重新实例化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值