【从零学Spring入门到高级】Chapter4~5——Spring对IoC的实现、Bean的作用域

1.IoC控制反转

  • 控制反转是一种思想。
  • 控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则。·控制反转,反转的是什么?
    • 将对象的创建权利交出去,交给第三方容器负责。
    • 将对象和对象之间关系的维护权交出去,交给第三方容器负责。
  • 控制反转这种思想如何实现呢?
    • Dl(Dependency Injection):依赖注入

2.依赖注入

  • Spring通过依赖注入的方式来完成Bean管理的。Bean管理说的是:Bean对象的创建,以及Bean对象中属性的赋值(或者叫做Bean对象之间关系的维护)。
  • 依赖注入:
    • 依赖指的是对象和对象之间的关联关系。
    • 注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系。     

依赖注入常见的实现方式包括两种:

1.set注入

set主入,基于set方法实现的,底层会通过反射机制调用属性对应的set方法然后给属性赋值。这种方式要求属性必须对外提供set方法。
简单截图记录

Bean类:

 配置文件:

2.构造注入

通过调用构造方法来给属性赋值

constructor标签的另一种写法

 以及更劲爆的,按类型

3.set注入专题

1.注入外部Bean

也就是之前在用的方式

2.注入内部Bean

bean标签嵌套内部,较少用,内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性

 

3.注入简单类型

简单类型诸如String、int

此时property里用value,不用ref

 

 简单类型解析,下图为Spring源码(第一个是八种基本以及包装类,第六个Temporal是Java8提供的时问和时区类,倒数第二个Locale是语言类)

4.级联属性赋值(了解)

使用级联属性赋值需要注意两点:
1.配置的顺序不能颠倒,必须如下顺序。2. clazz属性必须提供getter方法。

5.注入数组

bean

 spring配置

 

6.注入List集合

7.注入Set集合

8.注入Map集合

9.注入Properties

Properties本质上也是一个Map集合。Properties的父类Hashtable,Hashtable实现了Nap接口。虽然这个也是一个Map集合,但是利ap 的注入方式有点像,但是不同。
Properties 的 key 和 value 只能是String类型。

 

10.注入null和空字符串

 

 

 

11.注入的值中含有特殊

解决方案包括两种:
·第一种:特殊符号使用转义字符代替。
·第二种:将含有特殊符号的字符串放到:<I[CDATA]]>当中。因为放在CDATA区中的数据不会被XML文件解析器解析。
 

4.p命名空间注入

目的:简化配置。
使用p命名空间注入的前提条件包括两个:

  • 第一:在XML头部信息中添加p命名空间的配置信息: xmIns:p="http://www.springframework.org/schema/p'
  • 第二:p命名空间注入是基于setter方法的,所以需要对应的属性提供setter方法。

 

5.c命名空间注入

 

6.util命名空间

使用util命名空间可以让配置复用。

7.基于XML的自动装配

自动化注入又被称为自动装配。它可以根据名字进行自动装配,也可以根据类型进行自动装配。


1.根据名字

 

2.根据类型

 

8.spring引入外部属性

1.在resources里创建properties格式的文件,比如jdbc.properties

2.spring配置文件

还有一个隐藏问题,jdbc.properties最好像下图这样写,因为在spring配置文件中${username}会找到windows系统的用户名,这是一个小瑕疵 

与之对应,spring配置文件可以改成这样

 

进入第五章

9.Bean的作用域

spring默认情况下Bean是单例的。(单例: singleton)在:Spring 上下文初始化的时候实例化。每一次调川getBean()方法的时候,都返回那个单例的对象。
也就是这句代码执行时:

scope设置如下 

 

 spring上下文初始化的时候,并不会初始化这些prototype 的bean 。每一次调用getBean()方法的时候,实例化该bean对象。

scope的其他值

  • singleton:默认的,单例。
  • prototype:原型。每调用一次getBean()方法则获取一个新的Bean对象。或每次注入的时候都是新对象。
  • request:—个请求对应一个Bean。仅限于在WEB应用中使用。
  • session:一个会话对应一个Bean。仅限于在WEB应用中使用。
  • globlsesion: portle应用中专用的。如果在Serve的WEB应用中使用globalsession的话,和session一个效果。(portlet和servet都是规范。sevlet运行在servlet容器中,例如Tomcat,portlet运行在portlet容器中。)
  • application:一个应用对应—个Bean。仅限于在WEB应用中使用。
  • websocket:—个websocket生命周期对应一个Bean。仅限于在WEB应用中使用。
  • 自定义scope:很少使用。

猜你喜欢

转载自blog.csdn.net/m0_48385518/article/details/128578331