Spring之IoC

概念

  IoC:Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。但实际上依赖注入控制反转的一种表达方式(还有一种叫依赖查找)。什么是控制反转呢,简单来说就是本来上层建筑依赖下层建筑,下载通过依赖注入是下层建筑依附于上层建筑。具体表现就是通过注入的方式,为高级类(接口)添加依赖,注入方式可以为构造方法、set方法和接口注入(用得少,侵入性高)。

  而Spring就一种是典型的IoC容器(用来管理bean),并且可以帮助我们管理注入,省去许多麻烦(感觉有点像JVM帮我们管理内存一样)

  推荐看一下《Spring揭秘》这本书,讲的非常不错。

快速入门

首先导入IoC相关依赖:

spring-context
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>

然后是service和dao层的接口及其实现类:

接口及其实现类
public interface UserDao {
public void save();
} public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("保存用户信息");
}
} public interface UserService {
public void register();
} public class UserServiceImpl implements UserService {
@Override
public void register() {
System.out.println("注册");
}
}

再然后是xml配置:

applicationContext.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/">
<!--
定义bean
id:唯一标识符
class:bean所对应的类
-->
<bean id="userService" class="com.bilibili.service.impl.UserServiceImpl"></bean>
<bean id="userDao" class="com.bilibili.dao.impl.UserDaoImpl"></bean>
</beans>

通过spring工厂获取定义的JavaBean:

//加载配置文件,获取spring工厂,从容器中获取dao和service的实现类
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取service
UserService accountService = (UserService) ac.getBean("userService");
System.out.println(accountService);
//从容器中获取dao
UserDao userDao = (UserDao) ac.getBean("userDao");
System.out.println(userDao);

放一张被转烂了的图:

  可以看到BeanFactory是工厂的顶层接口,也就是帮助我们管理bean的,ApplicationContext是其子接口。当然,ApplicationContext除了具有BeanFactory的所有功能之外,还有国际化支持。统一资源加载策略、容器内时间发布的特性。同时,两者对于bean的创建时机也不一样,BeanFactory在需要的时候(调用getbean方法)时创建,ApplicationContext会在读取配置之后立即创建。

  上面给出了ApplicationContext的使用方法,BeanFactory则不太一样(XmlBeanFactory在3.1之后已过时):

Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory factory = new DefaultListableBeanFactory();
BeanDefinitionReader bdr = new XmlBeanDefinitionReader((BeanDefinitionRegistry) factory);
bdr.loadBeanDefinitions(resource);

ApplicationContext 接口的实现类非的三种实现类:

  • ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件,一般使用这种(类根路径为编译后class)
  • FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
  • AnnotationConfigApplicationContext: 注解实现类。

bean标签

bean标签的属性:

  • id:给对象在容器中提供的唯一标识,用于获取对象
  • class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
  • scope:指定对象的作用范围。
    值:
    • singleton :默认值,单例
    • prototype :多例
  • request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
  • session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
  • global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么 globalSession 相当于 session.
  • init-method:指定类中的初始化方法名称(生命周期相关)。
  • destroy-method:指定类中销毁方法名称(生命周期相关)。

bean的生命周期:

  • init-method: 配置bean创建时的初始化方法。
  • destory-method:配置bean销毁时的销毁方法。

在ApplicationContext中:

周期 单例singleton 多例prototype
对象出生 当应用加载,创建容器时,对象就被创建了。 当使用对象时,创建新的对象实例(getBean被调用)
对象存在 只要容器在,对象一直活着 只要对象在使用中,就一直活着
对象死亡 当应用卸载,销毁容器时,对象就被销毁了 当对象长时间不用时,被java的垃圾回收器回收了

创建bean的三种方式:

<!-- 默认无参构造,一般用这种 -->
<bean id="userService" class="com.bilibili.service.impl.UserServiceImpl"></bean>

工厂方式:

//静态工厂
public class BeansFacotory1 {
public static Object getBeans(){
return new UserServiceImpl();
}
}
//示例工厂
public class BeansFacotory2 {
public Object getBeans(){
return new UserServiceImpl();
}
}

配置方式:

<!-- 静态工厂方法创建对象
class:工厂类的全限定名
factory-method:工厂的静态方法
-->
<bean id="userService" class="com.bilibili.utils.BeansFacotory1" factory-method="getBeans"></bean> <!-- 实例工厂方法创建对象-->
<!-- 首先配置工厂类的实例 -->
<bean id="beansFactory2" class="com.bilibili.utils.BeansFacotory2"></bean>
<!-- factory-bean:配置工厂类实例对象
factory-method:工厂类中用于创建对象的方法
-->
<bean id="userService" factory-bean="beansFactory2" factory-method="getBeans"></bean>

小声BB:工厂都有了还要你spring干啥

依赖注入

面试官:为什么使用spring?

应聘者:因为方便?

面试官:什么?

让spring来管理bean的确方便

Web基础之Spring IoC的更多相关文章

  1. Web基础之Spring AOP与事务

    Spring之AOP AOP 全程Aspect Oriented Programming,直译就是面向切面编程.和POP.OOP相似,它也是一种编程思想.OOP强调的是封装.继承.多态,也就是功能的模 ...

  2. Web基础之Spring MVC

    Spring MVC Spring MVC 说是框架,对Tomcat来说其实就是一个Servlet,关于如何从上古时期的Servlet演化到如今的SpringMVC的,可以看看这篇博文:Spring ...

  3. Spring基础03——Spring IOC和DI概述

    1.什么是IOC与DI IOC(Inversion of Control):其思想是反转资源获取方向,传统的资源查找方式要求组件想容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了IOC之后 ...

  4. Spring5 概述及Spring IOC学习

    Spring Framework 5 1. Spring框架 1.1 Spring框架概述 1.2 主要内容 Spring框架是一个开源的JavaEE的应用程序 主要核心是 IOC(控制反转)和AOP ...

  5. Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式

     本节主要内容:    1. 给MessageBean注入参数值    2. 测试Spring自动组件扫描方式    3. 如何控制ExampleBean实例化方式    4. 使用注解方式重构Jdb ...

  6. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  7. Web环境中Spring的启动过程

    1.spring不但可以在JavaSE环境中应用,在Web环境中也可以广泛应用,Spring在web环境中应用时,需要在应用的web.xml文件中添加如下的配置: …… <context-par ...

  8. Spring——Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)

    基于Spring-4.3.7.RELEASE Spring的配置不仅仅局限在XML文件,同样也可以使用Java代码来配置.在这里我使用XML配置文件的方式来粗略地讲讲WebApplicationCon ...

  9. Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器

    第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...

随机推荐

  1. [NOI 2011]NOI 嘉年华

    Description 题库链接 给你 \(n\) 个区间,让你选出其中一些分为两组,要求两组区间不能有交集,组内可以有交集.让你最大化两组之间区间个数较小的那一组的选取区间个数.以及对于每个区间 \ ...

  2. jdbc学习over

    这次的代码和之前学习到一般的代码主要就是将一些很常见的操作(建立连接.清除连接)不管做什么操作都需要用到它们,所以将它们单独放到另一个工具类里面去. 用到的术语: 1.事务:https://www.c ...

  3. Write-up-CH4INRULZ_v1.0.1

    关于 下载地址:点我 哔哩哔哩:哔哩哔哩 信息收集 网卡:vboxnet0,192.168.56.1/24,Nmap扫存活主机发现IP为192.168.56.101 ➜ ~ nmap -sn 192. ...

  4. 本机连接虚拟机中docker启动的mysql数据库

    首先要保证本机能访问虚拟机的网络 并且虚拟机开通了mysql的访问端口 进入容器 docker exec -it 容器id /bin/bash 进入mysql数据库开启远程访问权限 mysql -ur ...

  5. LibreOJ #6001. 「网络流 24 题」太空飞行计划

    \(\quad\) 与网络流有关的最值有三个:最大流,最小费用,最小割.这道题是最小割.想了好久,终于想明白最小割应该怎么用. \(\quad\) 先找出矛盾的事物.在这道题中,两件事是矛盾的:做实验 ...

  6. 攻防世界web进阶区(2)--记一次sql注入

    题目地址:http://111.198.29.45:56094 这是一道sql注入题. 试试1' order by 3#,发现页面显示正常,将3换为4时,页面报错,则说明含有3个字段. 接下来判断输出 ...

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:单节点伪分布式安装

    实验目的 了解java的安装配置 学习配置对自己节点的免密码登陆 了解hdfs的配置和相关命令 了解yarn的配置 实验原理 1.Hadoop安装 Hadoop的安装对一个初学者来说是一个很头疼的事情 ...

  8. C++ 定位错误行

    ] = {}; SYSTEMTIME st; GetLocalTime(&st); sprintf_s(buf, , "%02d-%02d-%02d %02d:%02d:%02d | ...

  9. Zero 初识Sciter

    在浏览有关Sciter技术前,您需要花点时间浏览以下内容. 您是否需要花时间学习Sciter? 如果您的工作或您想从事的工作与桌面应用开发无关,那么您不需要学习Sciter. 如果您不认同HTML\C ...

  10. 「NOIP2007」树网的核

    传送门 Luogu 解题思路 这里着重介绍 \(O(n^3)\) 的做法,毕竟考场上只有 \(N\le300\) \(Q \omega Q\) 首先我们要知道,对任意一条直径算偏心距都是一样的. 证明 ...