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

一、IOC控制反转和DI依赖注入

1.控制反转,字面可以理解为:主动权的转移,原来一个应用程序内的对象是类通过new去主动创建并实例化的,对对像创建的主动权在程序代码中。程序不仅要管理业务逻辑也要管理对的象创建和依赖关系。这是很累的,也跟软件工程 "低耦合高内聚" 的概念不十分符合。

有了spring的ioc容器之后,对象的实例化和依赖关系管理都由IOC容器进行统一管理,主体类只要依赖ioc容器就够了,需要啥,容器会给他注入进去,也就是只要声明对象不用再主动去new,ioc容器帮忙把相应的对象注入到声明对象中,使其变成实例化对象。(类似主体类提供一个躯体,ioc容器把灵魂注入进去,使其变成一个生命体,激活他),这样创建对象的主动权就转移交接了,

  

二、使用xml配置方式实现IOC

1.在ioc容器中配置了dao实现类和service类的bean,在容器加载的时候就会实例化这些bean到内存中。(bean.xml配置如下)

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

  <!-- BookDao Bean -->
  <bean id="bookDao" class="com.study.DaoImpl.BookDaoImpl"></bean>

  <!-- BookService Bean-->
  <bean id="bookService" class="com.study.Service.BookService">
    <!-- BookService中的声明了BookDao对象,通过ref属性将BookDao的bean注入到对象中 -->
    <property name="bookDao" ref="bookDao"/>
  </bean>
</beans>

2. service类中需要用到dao类的实例(正常情况下需要new一个dao类对象),但是用ioc容器接管后只需要声明dao接口对象即可,然后写一个dao对象的set方法。(要注入的对象必须要有set方法,否则将报错 Bean property 'bookDao' is not writable or has an invalid setter method)因为spring注入是根据反射机制实现的,他在反射注入的时候会调用该方法名的set方法,如果set方法写错,或者根本没写,那么注入就会失败。(BookService类如下)

public class BookService {
 private BookDao bookDao;

 public BookService() {
  System.out.println("BookService实例化");
 }

 public void setBookDao(BookDao bookDao) {
  System.out.println("BookService属性初始化装配成功");
  this.bookDao = bookDao;
 }

 public void storeBook(String bookname){
  System.out.println("图书上架");
  System.out.println(bookDao.addBook(bookname));
 }
}

如上代码:BookSerivce类需要用到BookDao对象,但是却没有new对象,只有一个set方法,这个set方法就是ioc容器注入的入口(必不可少),

3.此处我们用ApplicationContext作为容器,初始化配置文件,然后从容器中根据id名取出容器中已经帮我们实例化好的对象。

public class TestDmeo {
 BookService bookService;

 @Test
 public void testStoreBook(){
  System.out.println("容器初始化");
  ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
  bookService = (BookService) app.getBean("bookService");//将对象注入到声明好的BookService对象中。(bookService就是配置文件中的id)
  bookService.storeBook("Spring MVC");
 }
}

 

4.dao类和实现类如下:

接口类:

public interface BookDao {
  public String addBook(String BookName);
 }

实现类:

public class BookDaoImpl implements BookDao {

 public BookDaoImpl() {
  System.out.println("BookDao实例化");
 }

 public String addBook(String BookName) {
  return BookName+"添加成功";
 }
}

5.运行测试结果:

6.大体思路如下图:

程序中除了初始化容器用了new对象,其余的基本没有new的存在。

二、注解方式配置IOC

注解配置方式目的和xml配置的目的一样,都是为了实现bean的创建。常用的注解如下:

@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。

@Repository 对Dao实现类进行注解 (特殊的@Component)

@Service 用于对业务逻辑层进行注解, (特殊的@Component)

@Controller 用于控制层注解 , (特殊的@Component)

装配注解如下:

@Autowired 默认按照类型装配注入,想按照名称来装配的话要结合@Quapfier(“name”)一起使用,使用@Autowired注解可以不用set方法。@Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个

@Quapfier("name") 中的name是bean的名字,也就是id,和@Autowired可以作为限定专配对象的名称

@Resource 默认按照名称装配注入,当找不到对应名成的bean的时候就按照类型匹配,如果还是找不到的话就会报错,@Autowired是spring提供的,@Resource是javaee提供,使用@Resource可以减少对spring的依赖

范例:

1.例子同上,只是配置bean的方式从xml文件中转移到了代码中,用注解体现。

2.除了把配置文件中<bean id="" class=""/>变成对应的注解外,另外一个区别在于,bean.xml文件中的修改,需要做如下,配置才能够使注解生效

context的配置有如下方法:

1.仅扫描特定包下的特定类

<context:component-scan base-package="com.study" resource-pattern="Service/B*.class"/>

这是扫描Service包下B开头的所有类。

2.使用<context:include-filter .../>和<context:exclude-filter .../>配置那些需要和不需要的扫描的包

Filter Type Examples Expression Description
annotation org.example.SomeAnnotation 符合SomeAnnoation的target class(注解类)
assignable org.example.SomeClass 指定class或interface的全名(指定确切的类或接口)
aspectj org.example..*Service+ AspectJ语法
regex org\.example\.Default.* Regelar Expression  (正则表达式)
custom org.example.MyTypeFilter Spring3新增自定义Type,org.springframework.core.type.TypeFilter
<!-- 容器扫描包下的注解配置组件 -->
  <context:component-scan base-package="com.study" use-default-filters="false">
    <context:include-filter type="aspectj" expression="com.study.Service.*"/> <!-- 模糊过滤 -->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/><!-- 过滤指定的注解 -->
    <context:include-filter type="assignable" expression="com.study.Service.BookService"/><!-- 过滤指定的类或接口,路径要完整,如果是接口的话,所有派生类都会被过滤 -->
    <context:include-filter type="regex" expression="com.*"/>
  </context:component-scan>

<context:exclude-filter ../>要配在<context:include-filter .../>的后面。

以上这篇详谈Spring对IOC的理解(推荐篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 深入理解Java的Spring框架中的IOC容器

    Spring IOC的原型 spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制. 这样做的好处是什么呢? 当然就是所谓的"解耦"了,可以使得程序的各模块之间的关系更为独立,只需要spring控制这些模块之间的依赖关系并在容器启动和初始化的过程中将依据这些依赖关系创建.管理和维护这些模块就好,如果需要改变模块间的依赖关系的话,甚至都不需要改变程序代码,只需要将

  • Spring实现IoC的多种方式小结

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了. IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现Io

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

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

  • 浅谈Spring中IOC的理解和认知

    IOC的推导 1.1.模拟一个正常查询信息的业务流程: ①mapper层:因为没有连接数据库,这里我们写一个mapper的实现类来模拟数据的查询 public interface PerMapper { void getPerInfo(); } public class StudentMapperImpl implements PerMapper { @Override public void getPerInfo() { System.out.println("我是一个学生"); }

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

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

  • 简单理解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 中 Bean 的理解与使用

    目录 一.定义 二.控制反转(IoC) 1.什么是依赖注入与控制反转呢?先通过一个例子来理解一下 2.让 Spring 控制类构建过程 3.这就是 IOC 三. @Bean 注解的使用 1.使用说明 2.Bean 名称 2.1.默认情况下 Bean 名称就是方法名(首字母小写),比如下面 Bean 名称便是 myBean 2.2.@Bean 注解支持设置别名.比如下面除了主名称 myBean 外,还有个别名 myBean1(两个都可以使用) 2.3.@Bean 注解可以接受一个 String 数

  • Spring之IOC详解

    学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup).依赖注入应用比较广泛.本篇我们通过一个实例和大家简单分析一下Spring中IOC的原理,以便我们可以更好的理解Spring. 简单描述一下我们

  • Spring中IOC和AOP的深入讲解

    前言 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益

  • 浅析springboot通过面向接口编程对控制反转IOC的理解

    IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确"谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了",那我们来深入分析一下: ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象

  • spring依赖注入深入理解

    IOC&&DI IOC(Inversion of Control)一般分为两种类型:依赖注入DI(Dependency Injection)和依赖查找(Dependency Lookup) org.springframework.beans.factory.BeanFactory是IOC容器的具体实现,是Spring IOC容器的核心接口 Spring IOC负责创建对象,管理对象,装配对象,配置对象,并且管理这些对象的整个生命周期. 优点:把应用的代码量降到最低.最小代价和最小侵入式是松

  • spring中IOC控制反转依赖注入和new对象的区别说明

    目录 IOC控制反转依赖注入和new对象的区别 new对象 依赖注入 spring的IOC容器比New对象究竟好在哪 IOC控制反转依赖注入和new对象的区别 spring默认是单例模式的,依赖注入其中操作的都是一个对象 new对象 单例中如果要做到注入的效果就是在类的头部进行实例化对象,这个时候该对象不管使用与否都贯穿该类的始终.该类对象不被回收,这个实例化对象也不会被回收,因为存在引用状态.如果要使用多例对象则最好使用new创建对象而不是依赖注入,即使依赖注入有多例模式也不推荐. 依赖注入:

随机推荐