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. c数据结构链式存储-静态链表

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  2. 【PAT甲级】1013 Battle Over Cities (25 分)(并查集,简单联通图)

    题意: 输入三个整数N,M,K(N<=1000,第四个数据1e5<=M<=1e6).有1~N个城市,M条高速公路,K次询问,每次询问输入一个被敌军占领的城市,所有和该城市相连的高速公 ...

  3. OOP的四大特征

    抽象 abstract 最近对抽象有些不熟悉,那么先谈谈抽象. 抽象在java中常常表现为抽象类和抽象方法,即被abstract关键字修饰的类和方法. 抽象类:被abstract修饰的类 1 和接口不 ...

  4. CSS盒模型的组成部分及实际大小

    盒模型的组成? 盒模型由内容区域.内边距.边框.外边距四部分组成. 盒模型实际大小? 盒模型实际大小由内容区域.内边距.边框三部分组成. 盒模型的box-sizing属性? 如果对盒子不进行设置(或者 ...

  5. (二)Buildroot介绍

    详情请参考: http://www.buildroot.org/downloads/manual/manual.html 参考博客: https://www.cnblogs.com/arnoldlu/ ...

  6. #写一个登陆的程序 ( 1.最多登录失败3次 2.登陆成功,提示欢迎XX登录,今天的日期是XXX,程序结束 3.要检验输入是否为空,账户和密码不能为空 4.账户不区分大小写)

    import datetime import MySQLdb today=datetime.datetime.today() username=str(input('请输入账户:')) passwd1 ...

  7. ROS学习笔记INF-重要操作列表

    该笔记将重要操作的步骤进行列表,以便查询: 添加消息 在包中的msg文件夹中创建msg文件 确保package.xml中的如下代码段被启用: <build_depend>message_g ...

  8. window和document的区别理解,bom和dom的区别理解

    Window对象: 是整个BOM的核心,所有对象和集合都以某种方式回接到window对象.Window对象表示整个浏览器窗口,但不必表示其中包含的内容. Document对象: 实际上是window对 ...

  9. Spring 通读官方文档

    Spring 通读官方文档 这部分参考文档涵盖了Spring Framework绝对不可或缺的所有技术. 其中最重要的是Spring Framework的控制反转(IoC)容器.Spring框架的Io ...

  10. 【android官方文档】与其他App交互

    发送用户到另外一个App YOU SHOULD ALSO READ 内容分享 One of Android's most important features is an app's ability ...