文档章节

spring-002-Ioc bean配置

haoran_10
 haoran_10
发布于 2016/07/15 16:44
字数 1638
阅读 2
收藏 0
点赞 0
评论 0

一、bean命名

1、直接命名

1.1、直接使用spring默认命名方式,不指定id;

1.2、只配置必须的全限定类名,由IoC容器为其生成一个标识;

1.3、客户端必须通过接口“T getBean(Class<T> requiredType)”获取Bean

 

<bean class="wang.conge.HelloImpl"/> HelloImpl hello = application.getBean(HelloImpl.class);

 

2、id命名

每个Bean可以有一个或多个id(或称之为标识符或名字),在这里我们把第一个id称为“标识符”,其余id叫做“别名”;这些id在IoC容器中必须唯一。

<bean id="testBeanId" class="wang.conge.HelloImpl"/> HelloImpl hello = application.getBean("testBeanId");

 

3、name命名

指定name,这样name就是“标识符”,必须在Ioc容器中唯一

<bean name="testBeanName" class="wang.conge.HelloImpl"/> HelloImpl hello = application.getBean("testBeanName");

 

4、id&name 混用

指定id和name,id就是标识符,而name就是别名,必须在Ioc容器中唯一

<bean id="testBeanId" name="testBeanName" class="wang.conge.HelloImpl"/> HelloImpl hello = application.getBean("testBeanId");

 

总结:Bean的命名遵循XML命名规范,但最好符合Java命名规范,由“字母、数字、下划线组成“,而且应该养成一个良好的命名习惯, 

比如采用“驼峰式”,即第一个单词首字母开始,从第二个单词开始首字母大写开始,这样可以增加可读性。 推荐采用驼峰式

 

 二、实例化bean

 1、构造器

1.1、使用空构造器

1.2、使用带有参数的构造器

<bean id="testBeanId1" class="wang.conge.HelloImpl"/>
<bean id="testBeanId2" class="wang.conge.HelloImpl">
       <constructor-arg index="0" value="Hello conge!"/>  //如果有多个参数,可以传多个参数进行构造
</bean> HelloImpl hello = application.getBean("testBeanId1"); HelloImpl hello = application.getBean("testBeanId2");

 

 2、静态工厂

2.1、使用这种方式除了指定必须的factory class属性,还要指定factory-method属性来指定实例化Bean的方法

2.2、使用静态工厂方法也允许指定方法参数,spring IoC容器将调用此属性指定的方法来获取Bean

public class HelloImplFactory { public static HelloImpl newInstance(String message) { return new HelloImp(message); } } <bean id="testBean" class="wang.conge.HelloImplFactory" factory-method="newInstance">  
     <constructor-arg index="0" value="Hello conge!"/>
</bean> HelloImpl hello = application.getBean("testBean");

 3、动态工厂

3.1、先实例化动态工厂类,使用Spring Ioc容器管理

3.2、使用factory-bean属性来指定配置的动态工厂bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样

public class HelloImplFactory { public HelloImpl newInstance(String message) { return new HelloImp(message); } } <bean id="beanFactory"  class="wang.conge.HelloImplFactory"/>
<bean id="testBean"  factory-bean="beanFactory"  factory-method="newInstance">
    <constructor-arg index="0" value="Hello conge!"/>
</bean> HelloImpl hello = application.getBean("testBean");

 

 

  三 依赖注入bean

spring 推荐类之间采用组合的方式,由spring负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,

并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。

1、构造器

使用构造器注入通过配置构造器参数实现,构造器参数就是依赖。除了构造器方式,还有静态工厂、实例工厂方法可以进行构造器注入

 

2、setter注入

2.1、setter注入,是通过在通过构造器、静态工厂或实例工厂实例好Bean后,通过调用Bean类的setter方法进行注入依赖

 

2.2、JavaBean:是本质就是一个POJO类,但具有一下限制:

         2.2.1、该类必须要有公共的无参构造器

         2.2.2、属性为private访问级别,不建议public,如private String message;

         2.2.3、属性必要时通过一组setter(修改器)和getter(访问器)方法来访问;

         2.2.4、setter方法,以“set” 开头,后跟首字母大写的属性名,如“setMesssage”,简单属性一般只有一个方法参数,方法返回值通常为“void”;

         2.2.5、getter方法,一般属性以“get”开头,对于boolean类型一般以“is”开头,后跟首字母大写的属性名,如“getMesssage”,“isOk”;

         2.2.6、还有一些其他特殊情况,比如属性有连续两个大写字母开头,如“URL”,则setter/getter方法为:“setURL”和“getURL”,其他一些特殊情况请参看“Java Bean”命名规范。

public class HelloImpl{ private String message; private void setMessage(String message){ this.message = message; } public String hello() { return "hello:" + message; } } <bean id="testBean"  class="wang.conge.HelloImpl">
    <property name="message" value="Hello conge!"/> 
</bean>

 

3、引用注入

依赖了其他bean,依赖注入的名称要相同

 

public class MessageImpl{ private String message = "tom"; private String getMessage(){ return this.message; } } public class HelloImpl{ private MessageImpl messageImpl; private void setMessageImpl(MessageImpl messageImpl){ this.messageImpl = messageImpl; } public String hello() { return "hello:" + messageImpl.getMessage(); } } <bean id="messageImpl"  class="wang.conge.MessageImpl" />


<bean id="testBean"  class="wang.conge.HelloImpl">
    <property name="messageImpl" ref="messageImpl"/> 
</bean>

 4、集合注入

map,set,list,collection

 

四、延迟初始化bean

延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。

配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。

 

五、使用depends-on

depends-on是指定Bean初始化及销毁时的顺序。

使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,

由于只有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”时,使用depends-on属性指定的Bean要在指定的Bean之后销毁。

 

六、bean的作用域

1、singleton:指“singleton”作用域的Bean只会在每个Spring IoC容器中存在一个实例,而且其完整生命周期完全由Spring容器管理。对于所有获取该Bean的操作Spring容器将只返回同一个Bean。

2、prototype:即原型,指每次向Spring容器请求获取Bean都返回一个全新的Bean,相对于“singleton”来说就是不缓存Bean,每次都是一个根据Bean定义创建的全新Bean。

在Web应用中,我们可能需要将数据存储到request、session、global session。因此Spring提供了三种Web作用域:request、session、globalSession。 

3、request作用域:表示每个请求需要容器创建一个全新Bean。比如提交表单的数据必须是对每次请求新建一个Bean来保持这些表单数据,请求结束释放这些数据。

4、session作用域:表示每个会话需要容器创建一个全新Bean。比如对于每个用户一般会有一个会话,该用户的用户信息需要存储到会话中,此时可以将该Bean配置为web作用域。 

5、globalSession:类似于session作用域,只是其用于portlet环境的web应用。如果在非portlet环境将视为session作用域。

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
深入理解Spring源码(一)-IOC容器的定位,载入,注册

前言:Spring源码继承,嵌套层次非常多,读起来非常容易晕,小伙伴们在看文章的时候一定要跟着文章的思路自己去源码里点一点,看一看,并且多看几次。就会越来越清晰。下面开始正题 1.Spring...

Meet相识_bfa5 ⋅ 05/01 ⋅ 0

Spring BeanFactory和FactoryBean

Spring BeanFactory和FactoryBean 1、BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是 Spring IOC所遵守的最底层和最基本的编程规范...

秋风醉了 ⋅ 04/16 ⋅ 0

SpringBoot的幕后推手...

一、背景   这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开...

Java工程师-Distance ⋅ 06/01 ⋅ 0

Spring IOC知识点一网打尽!

前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工...

Java3y ⋅ 05/22 ⋅ 0

Spring IOC 容器源码分析系列文章导读

1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已经非常成熟了。Spring 包含了众多模块,包括但不限于...

coolblog ⋅ 05/30 ⋅ 0

Spring基础篇——Spring容器和应用上下文理解

上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期。业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spr...

圆梦巨人 ⋅ 05/03 ⋅ 0

spring boot自动配置

@EnableAutoConfiguration 其实Spring框架本身也提供了几个名字为@Enable开头的Annotation定义,比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的......

细节探索者 ⋅ 06/17 ⋅ 0

Spring容器的属性配置详解的六个专题

在spring IOC容器的配置文件applicationContext.xml里,有一些配置细节值得一提。我们将一些问题归结为以下几个专题。 专题一:字面值问题 配置的bean节点中的值,我们提出一个概念——字面值...

qq948939246 ⋅ 04/24 ⋅ 0

Spring IOC 实现原理

Spring IOC 实现原理 IOC: Inversion of Control ,即 "控制反转" , 不是什么技术,而是一种思想。原先需要自行实例化的对象, 交给IOC容器去实现。那么控制反转,谁被控制? 谁被反转 ? 在...

起个名忒难 ⋅ 05/17 ⋅ 0

2.3 IoC容器的初始化过程

简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个启动包括BeanDefinition的Resource定位、载入和注册。 (1) Resource定位过程: 指的是BeanDefinition的资源定位,由Res...

edwardGe ⋅ 05/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部