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. stand up meeting 11/20/2015

    3组员 今日工作 工作耗时/h 明日计划 计划耗时/h 冯晓云 将输出string里的翻译合理取分为动名词等各种词性,按约定格式返回,按热度排列,但每一个词性下的解释仍然是由“$$”分词:对于查询词为 ...

  2. A - Oil Deposits DFS

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...

  3. 基于netty实现rpc框架-spring boot服务端

    demo地址 https://gitee.com/syher/grave-netty RPC介绍 首先了解一下RPC:远程过程调用.简单点说就是本地应用可以调用远程服务器的接口.那么通过什么方式调用远 ...

  4. 关于unix环境高级编程、Linux程序设计两部书浅谈

    unix环境高级编程的术语很多,概念内容,也很多,不过学习概念性质.标准规则类的东西,想必都是这样吧——需要进行拓展的内容很多. Linux程序设计,图文并茂,代码量够足,看起来,感觉难度还可以. l ...

  5. JDK的下载安装与环境变量的配置

    第一步:下载 方式一:在地址栏输入 www.oracle.com 访问该网址自行下载 方式二:百度网盘下载链接1.8  64位版本: https://pan.baidu.com/s/10ZMK7NB6 ...

  6. Ansible playbook Vault 加密

    Ansible playbook Vault 加密详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务 ...

  7. php 可变变量 $$name

    //可变变量 $name = 'abc'; $$name = '; echo $name . "<br/>"; // abc echo $$name . echo $a ...

  8. VRRP概念、工作原理

    VRRP是一种路由容错协议,也可以叫做备份路由协议,可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台. 控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器, 它负责转发 ...

  9. Python 输出 log 到文件的方法

    import loggingfrom logging.handlers import RotatingFileHandler module_name = "test_module" ...

  10. 【Linux题目】第六关

    [定时任务规则] 1. 如果在某用户的crontab文件中有以下记录,该行中的命令多久执行一次(RHCE考试题)?( ) 30 4 * * 3 mycmd A. 每小时. B. 每周. C. 每年三月 ...