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 1/13/2016

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  UI测试和调整:与主程序完成合并    6 查漏补缺,扫除UI ...

  2. stand up meeting 11/26/2015

    part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云  完成UI简易界面布局设计:在UI部分实现释义数据格式转换的实现和测试,使得其与外界接口均标准化为string,具体实现见 ...

  3. Windows Pains poj 2585

    Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with j ...

  4. (转载)基于BIGINT溢出错误的SQL注入

    我对于通过MySQL错误提取数据的新技术非常感兴趣,而本文中要介绍的就是这样一种技术.当我考察MySQL的整数处理方式的时候,突然对如何使其发生溢出产生了浓厚的兴趣.下面,我们来看看MySQL是如何存 ...

  5. 人体和电脑的关系——鸟哥的LINUX私房菜基础学习篇读书笔记

    CUP=脑袋: 每个人会做的事情都不一样(指令集的差异),但主要都是通过脑袋来判断与控制身体各部分的行动 内存=脑袋中存放正在思考的数据区块: 在实际活动过程中,我们的脑袋需要有外界刺激的数据(例如光 ...

  6. SpringCloud(四)学习笔记之Feign

    Feign是一个声明式的Web服务客户端,可帮助我们更加便捷.优雅地调用HTTP API Feign可以与Eureka和Ribbon组合使用以支持负载均衡 一.构建Eureka Server [基于第 ...

  7. MVC-基础01

    MVC体系结构将应用程序分成三个主要组件:模型(Model).视图(View).和控制器(Controller).在ASP.NET MVC应用程序中,数据操控的逻辑包含在Models文件夹下,数据的展 ...

  8. jeecg ant design vue一级菜单跳到外部页面——例如跳到百度

    需求:点击首页跳到百度新打开的页面 找到SideMenu.vue   对应的inde.js找到renderMenuItem 函数.加一个判断 if(menu.meta.url=='https://ww ...

  9. DBeaver数据表的拷贝过程

    通过DBeaver工具链接数据库后,我们就可以通过菜单或者命令功能来实现我们想要的目的. (一)创建数据库 新建数据库,如下图所示:  ——> 在点击“确定”按钮后,可能会遇到失败,此时,我们可 ...

  10. php中&&和and有什么区别

    PHP中的逻辑“与”运算有两种形式:AND 和 &&,同样“或”运算也有OR和||两种形式. 如果是单独两个表达式参加的运算,两种形式的结果完全相同,例如 $a AND $b和$a & ...