Spring IOC简单理解及创建对象的方式

spring框架

控制反转(Inversion on Control)在spring框架里面,一般交给Spring容器,这叫控制反转

什么是控制反转呢?

先来说一下控制正转,

class Demo{
    Student student = new Student();
}

简单地来说就是自己去创建对象,需要什么对象,就创建什么对象,实在当前文件中创建出来的,自己new出来的,这就叫做“控制正转”

那么控制反转是什么:

就是跟控制正转反着来,就是我需要的对象,我不需要自己new创建出来,我只需要到一个地方去取过来用,相当于让别人创建出来我们需要的对象。另外,让其它人来创建对象有两种方式:第一种是直接调用有参构造方法,另一种方法是调用构造方法,然后使用set方法实现。

第一种方式是在spring的配置文件中(applicationContext.xml)中写

applicationContext.xml

<!-- 其中scope是范围的意思
	singleton是单例模式,无论是否存在创建student这个操作,都会创建一个student对象,只创建一个
	prototype是多例模式,只要当你进行创建操作的时候才会进行创建
	举个例子,单例模式就像一台电脑,无论你用不用,它都在那里,也不会分裂多出一个,也不会少一个
			而多例模式就像挤牙膏,就是那种,你挤多少,出来多少,如果不挤就没有
-->
<bean scope="singleton" name="student" class="com.example.spring.entity.Student">
	<constructor-arg name="id" value="1"/>
    <constructor-arg name="name" value="张三"/>
    <!-- 当你创建的对像包括一个引用类型的时候,使用ref:reference:参考,引用来进行构造,调用的就是下面的course对象 -->
    <constructor-arg name="course" ref="com.example.spring.entity.Course"/>
</bean>

Demo.class

public class Demo{
    public static void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationCOntext("applicationContext.xml");
        Student student  = (Student) context.getBean("student"); // 根据你在applicationContext.xml的名字找到要创建的
    }
}

第二种方式是使用spring的配置文件中调用无参构造方法,然后通过使用set方法将元素放进去

applicationContext.xml

<bean scope="singleton" name="course" class="com.example.spring.entity.Course">
	<property name="id" value="1"/>
    <property name="name" value="java"/>
</bean>

该种方法是构建一个无参构造方法,然后将<property>里面对应的元素拿出来,使用set方法放进去,至于对应的class文件也等用于是上面的Demo.class

对于第二种方法的优化:

具体表现在三层架构方面

StudentController.class

// 前面这个注释等同于@Controller,在其他层次对应的就是@service @Repository注释是放在实现类上面的
// 相当于 ApplicationContext.xml 文件中的
//		<bean name="studentController" class="com.example.spring.controller">
// 		    <property name="studentService" ref="studnetService"/>
//      </bean>
@Controller(name="studentController")
public class StudentController{
    // @Resource(name="studnetService") 就相当于调用setStudentService()方法将下面对应的元素放进Controller对象里
    // <property name="studentService" ref="studnetService"/>
    // 然后 ref 在调用
    // <bean name="studentService" class="com.example.spring.service.impl.StudentServiceImpl"><bean>
    @Resource(name="studentService")
    private StudentService studentService;

    public void selectAll(){
        studentService.selectAll();
    }
    public void setStudnetService(StudentService studnetService){
        this.studnetService = studentService;
    }

}

在次优化变成

StudentController.class

@Controller
public class StudnetController{
    @Autowired // 这个会自动进行依赖注入,也不用特意写一个set方法了很方便,但是要注意配置文件,要进行配置,扫描注释
     private StudentService studentService;

    public void selectAll(){
        studentService.selectAll();
    }

}

applicationContext.xml

<!-- 扫描base-package对应的包下面类中所有的注解-->
    <context:component-scan base-package="com.example.spring"/>

问题来了,Autowried是根据类型进行注入的,但是如果某个接口存在多个实现的子类,那么Autowried是注入哪一个?又或者说会报错?

答案:Error create bean with ‘studnetController',原因并不是因为StudentController里面,而是因为StudentController里面使用了Autowired进行注入,而存在多个实现的几口expected single matching bean but found 2: banjiServiceImpl,banjiServiceImpl2,那么解决方案是:

@Controller
public class StudnetController{
    @Autowired
    // 添加下面的注解,写明白是用那个注入
    @Qualifier(value="studentServiceImpl2")
     private StudentService studentService;

    public void selectAll(){
        studentService.selectAll();
    }

}

到此这篇关于Spring IOC简单理解的文章就介绍到这了,更多相关Spring IOC内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring创建IOC容器的方式解析

    1.直接得到 IOC 容器对象 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 封装起来: public class ApplicationContextUtil { private static ApplicationContext applicationContext = null; public ApplicationCont

  • SPRING IOC注入方式过程解析

    这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring IOC注入的方法主要有两种 1:设值注入 2:构造注入 简单来说一个是调用set方法设值,一个是通过构造函数设值 Spring-ioc.xml <?xml version= "1.0" encoding= "UTF-8"?> <beans xmlns= "http://ww

  • 详解Spring IOC 容器启动流程分析

    使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要是在 BeanDefinition 的解析上.而对于核心的容器启动流程,仍然是一致的. AbstractApplicationContext 的 refresh 方法实现了 IOC 容器启动的主要逻辑,启动流程中的关键步骤在源码中也可以对应到独立的方法.接下来以  AbstractApplicationContext 的实现类  ClassPathXmlAp

  • Spring为IOC容器注入Bean的五种方式详解

    这篇文章主要介绍了Spring为IOC容器注入Bean的五种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一 @Import导入组件,id默认是组件的全类名 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: @Conditional({WindowsCondition.class}) @Configuration @Import({Color.class,Red.class,MyImportSelector

  • Spring IoC容器知识点详解

    可以把 Spring IoC 容器比作一间餐馆,当你来到餐馆,通常会直接招呼服务员:点菜!至于菜的原料是什么?如何用原料把菜做出来?可能你根本就不关心.IoC 容器也是一样,你只需要告诉它需要某个bean,它就把对应的实例(instance)扔给你,至于这个bean是否依赖其他组件,怎样完成它的初始化,根本就不需要你关心. 作为餐馆,想要做出菜肴,得知道菜的原料和菜谱,同样地,IoC 容器想要管理各个业务对象以及它们之间的依赖关系,需要通过某种途径来记录和管理这些信息.BeanDefinitio

  • 使用spring的IOC解决程序耦合的方法

    在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来.在接下来的使用的时候,直接拿过来用就好了. 那么,这个读取配置文件,创建和获取三层对象的类就是工厂. 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实

  • Spring IOC和aop的原理及实例详解

    这篇文章主要介绍了Spring IOC和aop的原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.特点是面向接口编程,松耦合. 1:IOC(控制反转) 别名(DI:依赖注入) 首先来一段ioc的实现原来代码: public class ClassPathXmlApplicationContext implements BeanFactory { privat

  • Spring IOC简单理解及创建对象的方式

    spring框架 控制反转(Inversion on Control)在spring框架里面,一般交给Spring容器,这叫控制反转 什么是控制反转呢? 先来说一下控制正转, class Demo{ Student student = new Student(); } 简单地来说就是自己去创建对象,需要什么对象,就创建什么对象,实在当前文件中创建出来的,自己new出来的,这就叫做"控制正转" 那么控制反转是什么: 就是跟控制正转反着来,就是我需要的对象,我不需要自己new创建出来,我只

  • 向Spring IOC 容器动态注册bean实现方式

    目录 本文的大纲 从一个需求谈起 Spring Bean的生命周期再完善 BeanDefinition Bean 加入IOC容器的几种方式 从spring容器中动态添加或移除bean 本文的大纲 从一个需求谈起 这周遇到了这样一个需求,从第三方的数据库中获取值,只是一个简单的分页查询,处理这种问题,我一般都是在配置文件中配置数据库的地址等相关信息,然后在Spring Configuration 注册数据量连接池的bean,然后再将数据库连接池给JdbcTemplate, 但是这种的缺陷是,假设填

  • spring IOC中三种依赖注入方式

    一.Spring IOC(依赖注入的三种方式): 1.Setter方法注入. 2.构造方法注入. 使用构造方法,注入bean值. 关键代码: public UserServiceImpl(UserDao dao) { this.dao=dao; } <bean id="service" class="service.impl.UserServiceImpl"> <constructor-arg><ref bean="dao&q

  • Spring IOC容器Bean注解创建对象组件扫描

    目录 Spring IOC Bean注解对象组件扫描 一.spring 针对 bean 管理中创建对象提供注解 1. 引入依赖 2. 开启组件扫描 3. 创建类,并添加注解来创建对象 4. 测试一下 二.组件扫描的其他过滤条件 1. include-filter 2. exclude-filter Spring IOC Bean注解对象组件扫描 什么是注解? 注解是代码里的特殊标记,格式: @注解名称(属性名称=属性值, 属性名称2=属性值...) 可以作用在:类.方法.属性上面. 使用注解的目

  • Spring IOC和DI实现原理及实例解析

    什么是Spring Spring是一个以IoC和AOP为内核的框架. IoC(Inversion of Control ,控制反转)是Spring的基础. IoC简单说就是创建对象由以前的程序员调用new 构造方法,变成了交由Spring创建对象. DI(Dependency Inject,依赖注入)与IoC的含义相同,只不过这两个称呼是从两个角度描述的同一个概念. 简单地说, DI就是对象的属性,已经被注入好相关值了,直接使用即可. IoC-控制反转   把各个对象类封装之后,通过IoC容器来

  • 简单理解Spring之IOC和AOP及代码示例

    Spring是一个开源框架,主要实现两件事,IOC(控制反转)和AOP(面向切面编程). IOC 控制反转,也可以称为依赖倒置. 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:Bb=newB(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂.Locator等等),然后你就可以调用b对象了.

  • Spring IOC创建对象的两种方式

    IOC创建对象的方式 一. 使用无参构造创建对象(默认方式) 创建实体类 注意:属性必须要有set方法,来完成注入 public class User { private String name; public User() { System.out.println("执行了User类的无参构造方法~"); } public User(String name){ this.name = name; System.out.println("执行了User类的有参构造方法&quo

  • 详谈Spring对IOC的理解(推荐篇)

    一.IOC控制反转和DI依赖注入 1.控制反转,字面可以理解为:主动权的转移,原来一个应用程序内的对象是类通过new去主动创建并实例化的,对对像创建的主动权在程序代码中.程序不仅要管理业务逻辑也要管理对的象创建和依赖关系.这是很累的,也跟软件工程 "低耦合高内聚" 的概念不十分符合. 有了spring的ioc容器之后,对象的实例化和依赖关系管理都由IOC容器进行统一管理,主体类只要依赖ioc容器就够了,需要啥,容器会给他注入进去,也就是只要声明对象不用再主动去new,ioc容器帮忙把相

  • 浅谈spring ioc的注入方式及注入不同的数据类型

    关于Spring-IoC的简单使用参考: spring ioc的简单实例及bean的作用域属性解析 1.通过set方法注入不同数据类型 测试类代码(set方式注入的属性一定要加set方法) /**通过set方法注入示例*/ public class IoC_By_Set { /**注入Integer类型参数*/ private Integer id; /**注入String类型参数*/ private String name; /**注入实体Bean*/ private User user; /

  • Spring IOC与DI核心深入理解

    目录 深入理解IOC思想 DI&IOC 深入理解IOC思想 spring本质就在于将对象全部交由给spring容器创建和管理,由容器控制对象的整个生命周期.核心就是IOC控制反转和AOP面向切面编程 先说IOC IOC是一种设计思想,叫做控制反转.本质就是通过Spring来负责对象的生命周期以及对象间的关系.在面向对象的开发过程中,我们程序中的各个对象往往会存在各种各样的依赖关系,因此耦合度极高,一旦修改其中一个类信息就会牵扯到很多相关类需要修改.那么为了降低这种耦合度IOC指出引用第三方容器,

随机推荐