SpringIOC使用详解

一、IOC简介

IOC(Inversion of Control):控制反转,即对象创建的问题。通俗地讲就是把创建对象的代码交给了Spring的配置文件来进行的。这样做的优点是大大降低的代码的耦合度。

二、底层原理

为了方便对IOC的理解和使用,我们先来介绍一下IOC的原理。

IOC操作底层原理使用的技术如下:

  • xml配置文件
  • dom4j(解决xml问题)
  • 工厂设计模式(用于创建对象)
  • 反射(用于创建对象)

前两点很好理解,接下来我们来用代码实现一下工厂设计模式和反射创建。

首先我们需要一个User类,代码如下:

public class User {
private int age;
private String name; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
}
}

最初阶段,我们如果创建一个对象肯定都是利用 new User()来创建对象。而现在,为了降低耦合度,我们需要同过反射和工厂模式来创建一个对象。

下面通过反射和工厂模式来创建一个类

/**
* 创建工厂类
* **/
public class Factory {
//创建返回User对象的方法
public static User getUser() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
String classValue="com.testWeb.daomain.User";
//使用反射的方法创建对象
Class aClass=Class.forName(classValue);
User user= (User) aClass.newInstance();
return user;
}
}

通过测试类测试

public class testSpring {
@Test
public void test() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println(Factory.getUser());
}
}

输出结果:

在Spring中,我们只需要通过配置xml文件,就可以轻松创建对象了,是不是非常简单!

接下来,我们来进行代码演示Spring的IOC

三、代码示例

IOC创建实例对象有两种方法,一种是配置文件创建,另一种是注解的方法创建,在实际开发中我们主要使用,配置文件来创建对象。

1.配置文件创建

这里我们需要三步:

第一步、创建配置文件

我们在根目录下创applicationContext.xml(PS:名称可以不唯一)的配置文件,并且主体部分如下,

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

如果您使用的是idea编译器,可以鼠标右键轻松创建配置文件

第二步、创建类。(我们之前创建了User类,这里就不演示了)

第三步、配置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:用于SpringIOC调用,可以为任意
class:类的全路径
scope:作用范围,scope不是必填属性,不写的默认值单例。为创建对象的方式,有两种结果:
1.singleton默认值,单实例。(常用)
2.prototype 多实例。(常用)
3.request:作用于 web 应用的请求范围
4.session:作用于 web 应用的会话范围
5.global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,就是session
-->
<bean id="user" class="com.testWeb.daomain.User" scope="prototype"></bean>
</beans>

第四步、写测试代码测试

public class testSpring {
@Test
public void testIOC(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
User user1= (User) context.getBean("user");
User user2=(User) context.getBean("user");
System.out.println(user1+user2);//如果scope为单例,两个对象的地址相同,多例效果则相反
}
}

其实,除了上述默认创建实例的方法外还有另一种不常用的实例工厂创建对象的方法:

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">
<!--实例工厂创建-->
<bean id="factory" class="com.testWeb.daomain.BeanFactory"></bean>
<bean id="bean" factory-bean="factory" factory-method="getBean" ></bean>
</beans>

BeanFactory类

public class BeanFactory{
public BeanFactory getBran (){
return new BeanFactory;
}
}

2.注解创建

首先来指出四种创建对象的四种注解方式:(四种注解本质上创建对象的方法是相同的,名称只是起到了清晰用途的作用)

​ 首先是@Component注解创建,它又衍生出了三种注解:

  1. @Controller :web层

  2. @Service :service层

  3. @repository:持久层

    接下来进行代码操作

    第一步、开启注解扫描

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--
    base-package:标注扫描的路径
    -->
    <!--开启注解扫描-->
    <context:component-scan base-package="com.testWeb"></context:component-scan>
    </beans>

    第二步、为创建的类添加注解

    package com.testWeb.daomain;
    
    import org.springframework.stereotype.Component;
    //value用于用于SpringIOC调用,可以为任意,和bean的id作用一样
    //Scope和配置文件中的Scope一致,这里的意思为创建的实例对象为多实例。
    @Component(value = "person")
    @Scope(value = "prototype")
    public class Person {
    public void test(){
    System.out.println("test");
    }
    }

    第三步、添加测试代码

    public class testSpring {
    @Test
    public void testIOC(){
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    Person person= (Person) context.getBean("person");
    person.test();
    }
    }

最新文章

  1. Dos学习笔记(1)dir命令
  2. iOS应用之间调用
  3. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)
  4. .net RAW(16)与GUID互相转换
  5. MySQL忘记了密码登录不进去,用命令符修改新的密码重新登录的方法
  6. Median of Two Sorted 求两个有序数组的中位数
  7. ASP.NET Web Service应用发布到IIs怎么做
  8. mac下安装composer
  9. php根据IP获取IP所在城市
  10. 如何在mybatis 中使用In操作
  11. 错误代码: 1381 You are not using binary logging
  12. TCP长连接保持连接状态
  13. 在 vue.js 中动态绑定 v-model
  14. WordPress分类列表函数:wp_list_categories用法及参数详解举例
  15. nginx 配置简单网站项目(linux下)
  16. aws的安全组
  17. ssdb使用笔记
  18. linux通过python设置系统默认编码
  19. 全方位Bindind分析
  20. 【Luogu4609】建筑师(第一类斯特林数,组合数学)

热门文章

  1. 从hfctf学习JWT伪造
  2. 详解 继承(下)—— super关键字 与 多态
  3. 你知道什么是 GitHub Action 么?
  4. python 基础篇 自定义函数
  5. python 携程asyncio 实现高并发示例2
  6. 2019-2020-1 20199329 第二周测试(环境:ubuntu64位)
  7. opencv-9-图像噪声以及评估指标 PSNR 与SSIM
  8. 理解分布式一致性:Paxos协议之Multi-Paxos
  9. 解决从dockerhub上下载debian:jessie失败
  10. 【JAVA基础】10 Object类