文档章节

Spring再回首一:IOC与DI

silence88
 silence88
发布于 2017/02/16 14:51
字数 1253
阅读 5
收藏 1

1、spring管理bean的两种方式:xml和注解

2、bean实例化的3中方式:

  • 基于无参构造函数(常用)

注意类里面如果已经提供了一个有参数的的构造函数,一定还要给一个无参的构造函数。

  <bean class="cn.zxy.Person" id="person"></bean>
  • 静态工厂
<bean id="person" class="cn.zxy.factory.PersonStaticFactory" factory-method="createPerson">

这里的class是值得工程类所在的位置,后面的method指定的是通过那个静态方法获取到person的实例

  • 实例工厂(返回类的对象的方法不是静态的方法)
<!-- 实例工程方法需要先创建工厂实例,然后在创建所需对象的时候,将其赋值为factory-bean -->
<bean id="personFactory" class="cn.zxy.factory.PersonFactory"></bean>
<bean id="person2" factory-bean="personFactory" factory-method="createInstance"></bean>

3、bean的作用范围scope

singleton:单例的,不指定的时候默认就是这个。

prototype:原型,多例的。

request:spring创建一个bean对象,将对象存放在request域中

session:spring创建一个bean对象,将对象存放在session域中

globleSession:xxxx

4、spring属性的2种注入方式:

  • set方式注入(常用)
<bean class="cn.zxy.Person" id="person">
   <property name="name" value="zxy"></property>
   <property name="id" value="125"></property>
</bean>

注意类中对每一个要注入的域提供set方法,如果属性是另外一个对象,则value应该改为ref。ref给对应的beanid。

上述的注入方式可以换种方式写(p名称空间注入)。

<bean class="cn.zxy.Person" id="person" p:name="zxy" p:id="125"></bean>

命名空间p 的schema URI 为http://www.springframework.org/schema/p。如果你想使用命名空间p,只需要在Spring 的XML 配置中增加段声明

  • 有参构造注入(注意提供有参数构造方法):
 <bean class="cn.zxy.Person" id="person">
     <constructor-arg name="id" value="125"></constructor-arg>
     <constructor-arg name="name" value="zxy"></constructor-arg>
 </bean>

5、set方式注入复杂数据类型

数组、list、map、properties

6、IOC和DI

IOC:控制反转,将bean的管理交给spring。

DI:依赖注入,向类里面的属性设置值

两者之间的关系:依赖注入不能单独存在,依赖于IOC

7、spring管理bean注解方式

注解相关的类放在aop的jar里面了

开启注解扫描配置两种方式以及区别:

1、

<!-- 开启注解扫描,到包里面扫描类、方法、属性上面是否有-->
<context:component-scan base-package="com.bdqn.entity"></context:component-scan>

2、

<!--只扫描属性上的注解-->
<context:annotation-config></context:annotation-config>

创建对象的四种注解形式

  • Controller: 用于控制器的注解
  • Service : 用于service的注解
  • Component: 用于基本组件的注解
  • Repository:用于Dao层的注解

其实,对于spring来说,它根本无法识别controller,service等,它只知道只要你加了以上四个注解,它就帮你创建bean,简单来说,就是如果你在控制器上使用Component注解,或者使用Repository注解也是可以的,四种注解可以混用,但是,我们一般都按照上方所示的规则来使用注解,这样代码才有可读性

默认命名规则

  • 我们使用注解配置bean的时候,并没有指定bean的id,那么spring帮我们创建bean的时候会给一个默认的id,id为类名首字母小写。如TestController-> testController
  • 我们也可以指定bean的名称(id),使用注解的value属性,如@Service(value=”myService”)
  • value属性是注解的默认属性,可以省略,即@Service(“myService”)

注解注入属性(两种方式)

@Autowired:注解自动装配,无需指定是哪个bean的名称不常用

@Resource:常用,注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为Bean的名称.

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配; 

© 著作权归作者所有

共有 人打赏支持
silence88
粉丝 7
博文 71
码字总数 72855
作品 0
深圳
程序员
spring学习3-Ioc和DI的简单介绍

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转还有一个名字叫做依赖注入(Depende...

大嘴吃鸡腿
2014/03/16
0
0
Spring IoC & DI

IOC诞生的历史 在没有IoC时,关联不同模块是通过类实例实现的,代码可能是这样子的: 当YourServiceImpl的接口不变时,只需要根据业务需要更换不同的YourService实现类即可。一旦更换实现类时...

classfly
06/18
0
0
三分钟轻松了解Spring框架基础知识

做为一个合格的Java开发人员,你一定听说过Spring框架,虽然会应用,但却未必能够深入理解框架的原理,只是像其它人一样,泛泛的只是停留在理解的层面。小编会带着大家一步步了解Spring框架。...

爱尚实训
07/22
0
0
spring 入门及IOC容器

Spring 一.Spring,原意“春天”,是一种轻量级容器框架,所谓轻量级就是依赖比较少,侵入性较低,其核心就是1. IOC(Inversion of Control)/DI(Dependency Injection)IoC的核心思想是通过消...

天国使者125
2013/06/15
0
0
spring IOC/DI容器的理解

参与者:应用程序和spring 正向:现在的程序方向,A对象要使用B对象,现在是A里面直接创建B的实例,然后调用。 publc class A{ void t1(){ new B().t2(); } } public class B{ void t2(); 简...

君辰
2015/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kubernetes 中的 Service

kubernetes 中的 Service

健康的程序员
45分钟前
1
0
七牛云java(服务端)通用工具类

前言 需要安装lombok插件。 功能列表 上传本地文件 上传Base64图片 获取文件访问地址 上传MultipartFile 代码 pom.xml <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java......

五毛程序员
46分钟前
1
0
Pandoc 批量将 Markdown 转为 Docx

看到了小金鱼儿的博文,很给力,核心代码如下: #!/bin/shfunction ergodic(){ for fullname in `ls $1` do name=${fullname%.*} ext=${fullname##*.} if [ "$ext"x = "md"......

hengbao5
47分钟前
2
0
cocos creator实现卡牌翻转

var pic1 = cc.find("Canvas/puke/hu"); var run = cc.callFunc(function() { cc.loader.loadRes("longhu/card", cc.SpriteAtlas, function (err, atlas) { let frame = atlas.getSpriteFram......

AndyZhouX
55分钟前
0
0
Linux服务器上监控网络带宽的18个常用命令

本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。 一些命令可以显示单...

谢思华
55分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部