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();
    }
    }

Spring IOC使用详解的更多相关文章

  1. Spring ——Spring IoC容器详解(图示)

    1.1 Spring IoC容器 从昨天的例子当中我们已经知道spring IoC容器的作用,它可以容纳我们所开发的各种Bean.并且我们可以从中获取各种发布在Spring IoC容器里的Bean,并 ...

  2. Spring IoC原理详解

    去掌握一门技术的时候,往往很多人都忽略了一点,只是一味地去写代码,原理层面的东西从来就不理会 还有就是学习的过程中,不去想为什么有了当前的写法,却有着这么一门技术可以代替它 一般来说,在写程序的时候, ...

  3. Spring IoC 使用详解

    在Spring中,依赖注入(DI)模式实现了控制反转(IoC)原理.让我们通过一个例子来帮助理解依赖注入.我们先看到java版的例子,然后在此基础上加上spring的功能.就例子而言,是相当地简单.Q ...

  4. [Spring学习笔记 1 ] Spring 简介,初步知识--Ioc容器详解 基本原理。

    一.Spring Ioc容器详解(1) 20131105 1.一切都是Bean Bean可是一个字符串或者是数字,一般是一些业务组件. 粒度一般比较粗. 2.Bean的名称 xml配置文件中,id属性 ...

  5. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  6. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...

  7. spring注入参数详解

    spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...

  8. Spring Boot 配置文件详解

    Spring Boot配置文件详解 Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件.他们的作用都是修改Spring Boot自动配置的默认值.相对于prop ...

  9. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

随机推荐

  1. SDL-开篇明义

    SDL只是方法论,忌为SDL而SDL 1.sdl是什么 sdl是安全研发生命周期 ,一个方法论, 理念是安全左移, 通过各种方法.工具.流程设计和交付更安全的软件,以期望降低安全成本,最终还是为了保护 ...

  2. 浅析CopyOnWriteArrayList

    CopyOnWriteArrayList引入 模拟传统的ArrayList出现线程不安全的现象 public class Demo1 { public static void main(String[ ...

  3. 2020-3 网络对抗技术 20175120 exp5 信息搜集与漏洞扫描

    目录 实践目标 实践内容 各种搜索技巧的应用 搜索特定类型的文件Google Hacking 搜索网站目录结构 DNS IP注册信息的查询 网络侦查 基本的扫描技术:主机发现.端口扫描.OS及服务版本 ...

  4. 手写一个简单的HashMap

    HashMap简介 HashMap是Java中一中非常常用的数据结构,也基本是面试中的"必考题".它实现了基于"K-V"形式的键值对的高效存取.JDK1.7之前 ...

  5. Linux-监控与安全运维之zabbix

    zabbix: Zabbix是一个开源分布式监控平台,包含诸多监控功能,用于构建一个符合企业级的监控解决方案.软件由开源社区提供开发和维护,遵循GPL协议,可以自由传播和使用,但开发团队提供收费的技术 ...

  6. 移植seetafaceengine-master、opencv到ARM板

    0.前言 在要移植opecv和SeetaFaceEngine-master到ARM板子上运行的所有步骤之前,有几点需要注意的: 查看板子运行的Kernel版本 交叉编译工具链的gcc版本,关键就是工具 ...

  7. 聊聊JavaScript在工作中常用的方法(一)

    一.字符串转数组(split方法) 废话少说,直接上代码: //例子1 var str="abc,def,ghi"; var strArray=str.split(",& ...

  8. 挑战全网最幽默的Vuex系列教程:第六讲 Vuex的管理员Module(实战篇)

    写在前面 这一讲是 Vuex 基础篇的最后一讲,也是最为复杂的一讲.如果按照官方来的话,对于新手可能有点难以接受,所以想了下,决定干脆多花点时间,用一个简单的例子来讲解,顺便也复习一下之前的知识点. ...

  9. CentOS配置Tomcat监听80端口,虚拟主机

    2019独角兽企业重金招聘Python工程师标准>>> Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [ro ...

  10. Django中的content_type表

    models.py from django.db import models from django.contrib.contenttypes.models import ContentType # ...