第二章 IoC

时间:2022-02-28 16:58:18
  • 什么是IoC
  • 如何配置IOC
  • Bean的生命周期
  • 多环境配置
  • 条件化配置Bean

什么是IOC?

IOC有两层含义,

1、控制反转:将对象实例的创建与销毁的权限交给Spring容器管理,而不再是调用对象内部自己new

2、依赖注入:Spring容器检测到对象之间的依赖关系,初始化(或者第一次调用)的时候,将对应的实例注入给相关的对象

如何配置IOC?

Spring通过几种方式,将Bean对象存放在Spring容器中

Spring的配置方法,根据配置“媒介”的不同,可以分为XML、Class类

使用XML对Bean进行配置,又可以按照XML的位置,分为类路径、文件系统路径、Web应用路径

表格中为几种Spring工厂

类路径XML   ClassPathXmlApplication
文件系统路径XML FileSystemXmlApplication
Web应用路径XML XmlWebApplication
Class类 AnnotationConfigApplicationContext、AnnotationConfigWebApplicationContext

使用XML配置Bean

一个最基本的XML配置的Bean如下

<bean id="user" class="demo01.part01.User"/>

使用p命名空间进行属性注入

<bean id="user" class="demo01.part01.User"
p:age="27"
p:name="哇哈哈"/>

一些简单的属性注入与构造器注入,都可以使用p和c命名空间

使用如下

public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
logger.debug("user:"+user); }

20:36:38.460 [main] DEBUG demo01.part01.Demo01 - user:demo01.part01.User@6e171cd7[name=哇哈哈,age=27]

如果容器中只有一个User实例,可以使用getBean(Class class)方法,这样就无需强制转化了

User user = applicationContext.getBean(User.class);

构造器注入

<bean id="user" class="demo01.part01.User">
<constructor-arg name="name" value="哇哈哈"/>
<constructor-arg name="age" value="12"/>
</bean> OR
<bean id="user" class="demo01.part01.User"
c:name="我问问"
c:age="17"/>

当然,前提是有此种构造方法

XML配置Bean的方式显得很麻烦,所以有更好的注解的方法,配置一个扫描,Bean上添加指定的注解就行。在Spring Boot,甚至连Bean上的注解都可以去掉了。

所以XML配置Bean的方式就不啰嗦了,对于遗留项目中有需要修改的时候,再参考书籍即可。自己开发的时候,尽可能使用Java配置+扫描,或者Spring Boot的方式

注解配置

在XML中使用

<context:component-scan base-package="demo01"/>

配置扫描范围

在Bean上使用注解,标识自己需要被扫描到

/**
* Created by sherry on 17/1/10.
*/
@Component
public class User {
......
}

Java配置

package demo01.part03;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan; /**
* Created by sherry on 17/1/10.
*/
@Configurable
@ComponentScan("demo01")
public class SpringBean { }

用一个Java类,代替了XML去描述Bean,Java类可以完全代替XML的配置

以上,只是简单描述了一下Spring容器的初始化的几种风格,实际上Spring的配置非常强大与灵活,足以满足我们开发过程中遇到的各种需求


IOC最佳实践


优先把配置都放在Java中,包括扫描目录、Bean初始化、引入其他Java配置类或XML配置文件

要在开发中遇到实际需求的时候,再考虑Spring为我们提供的简便配置方案

Bean的作用域

singletion:单例,这也是默认作用域

prototype:每次从容器中获取出来的都是新实例

request:

session:

global-session