文档章节

Spring 1 IoC 3 DI

fokYaland
 fokYaland
发布于 2015/06/04 17:26
字数 1238
阅读 4
收藏 0
Spring IoC容器注入依赖资源主要有以下两种基本实现方式:
      构造器注入:就是容器实例化Bean时注入那些依赖,通过在在Bean定义中指定构造器参数进行注入依赖,包括实例工厂方法参数注入依赖,但静态工厂方法参数不允许注入依赖;
       setter注入:通过setter方法进行注入依赖;

构造器注入,使用构造器注入通过配置构造器参数实现,构造器参数就是依赖。除了构造器方式,还有静态工厂、实例工厂方法可以进行构造器注入。
1       根据参数类型进行注入
<bean   id = "exampleBean"   class = "examples.ExampleBean" >
      <constructor-arg   type =   "int"   value = "7500000" />
      <constructor-arg   type =   "java.lang.String"   value = "42" />
</bean>

2      根据参数索引注入
<bean   id = "exampleBean"   class = "examples.ExampleBean" >
     <constructor-arg   index = "0"   value = "7500000"   />
     <constructor-arg   index = "1"   value = "42"   />
</bean>

3     根据参数名进行注入
  需要在构造器上使用 @ConstructorProperties(java.beans.ConstructorProperties)注解来指定参数名
public class   ExampleBean {
      // Fields omitted
      @ConstructorProperties({"years", "ultimateAnswer"})
       public   ExampleBean( int   years, String ultimateAnswer) {
             this .years = years;
             this .ultimateAnswer = ultimateAnswer;
       }
}
<bean   id = "exampleBean"   class = "examples.ExampleBean" >
      <constructor-arg   name =   "years"   value = "7500000" />
      <constructor-arg   name =   "ultimateanswer"   value = "42" />
</bean>


Spring3.1之后可用c命名空间,xmlns:c="http://www.springframework.org/schema/c"

<bean id="messageProvider" class = "com.apress.prospring3.ch4.ConfigurableMessageProvider"
     c:_0 = "This is c:message" />
 这里的message 是 构造方法的参数名称

setter注入,
<bean   id = "exampleBean"   class = "examples.ExampleBean" >
<!-- setter injection using the nested <ref/> element -->
<property   name = "beanOne" ><ref   bean   = "anotherExampleBean" /></property>
<!-- setter injection using the neater 'ref' attribute -->
<property   name = "beanTwo"   ref = "yetAnotherBean" />
<property   name = "integerProperty"   value = "1" />
</bean>
<bean   id = "anotherExampleBean"   class = "examples.AnotherBean" />
<bean   id = "yetAnotherBean"   class = "examples.YetAnotherBean" />

如果使用的Spring2.5以后,并且引入P命名空间
<beans   xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation   = "http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd"   >
<bean   id = "myDataSource"   class = "org.apache.commons.dbcp.BasicDataSource"
       destroy-method = "close"
       p:driverClassName   = "com.mysql.jdbc.Driver"
       p:url = "jdbc:mysql://localhost:3306/mydb"
       p:username = "root"
       p:password = "masterkaoli"   />
</beans>

注入集合、数组和字典
<bean   id = "moreComplexObject"   class = "example.ComplexObject" >
<!-- results in a setAdminEmails(java.util.Properties) call -->
      <property   name = "adminEmails" >
             <props>
                  <prop   key = "administrator" > administrator@example.org </prop>
                  <prop   key = "support" > support@example.org </prop>
                  <prop   key = "development" > development@example.org </prop>
             </props>
      </property>
<!-- results in a setSomeList(java.util.List) call -->
      <property   name = "someList" >
             <list>
                  <value> a list element followed by a reference </value>
                  <ref   bean = "myDataSource"   />
             </list>
       </property>
<!-- results in a setSomeMap(java.util.Map) call -->
      <property   name = "someMap" >
             <map>
                  <entry   key = "an entry"   value = "just some string" />
                  <entry   key   = "a ref"   value-ref = "myDataSource" />
             </map>
      </property>
<!-- results in a setSomeSet(java.util.Set) call -->
      <property   name = "someSet" >
             <set>
                  <value> just some string </value>
                  <ref   bean = "myDataSource"   />
             </set>
      </property>
</bean>

depends-on,指定Bean初始化及销毁时的顺序,
<bean id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>   
<bean id="decorator"   class="cn.javass.spring.chapter3.bean.HelloApiDecorator"     depends-on="helloApi">   
    <property name="helloApi"><ref bean="helloApi"/></property>   
</bean>
在“decorator”Bean初始化之前要先初始化“helloApi”,而在销毁“helloApi”之前先要销毁“decorator”,

lazy-init,延迟初始化Bean,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。 Spring容器会在创建容器时提前初始化“singleton”作用域的Bean,“singleton”就是单例的意思即整个容器每个Bean只有一个实例
<bean id="helloApi"   class="cn.javass.spring.chapter2.helloworld.HelloImpl"    lazy-init="true"/>

自动装配就是指由Spring来自动地注入依赖对象,无需人工参与。Spring3.0已不推荐使用之前版本的“autodetect”自动装配,推荐使用Java 5+支持的(@Autowired)注解方式代替

<bean id="kenny"     class="com.springinaction.springidol.Instrumentalist"
      autowire="byName">
     <property     name="song"     value="JingleBells"/>
</bean>

<bean id="duke"     class="com.springinaction.springidol.PoeticJuggler"      autowire="constructor"/>
@Autowired
public voidsetInstrument(Instrument     instrument){
     this.instrument=instrument;
}
@Autowired可以直接注解在属性上,实际上是byType装配。
@Autowired
private Instrument     instrument;

避免找不到bean时报错,可以:
@Autowired(required=false)
private Instrument  instrument;

避免找到多个bean,可以用 Qualifier指定bean id
@Autowired
@Qualifier("guitar")
private Instrument instrument;

Bean 范围,默认Spring生成的bean都是单例的。如果需要每次生成新的实例,可以:
<bean id="ticket"     class="com.springinaction.springidol.Ticket"   scope="prototype"/>

singleton 单例,默认
prototype 每次调用重新生成
request 适用与WEB
session
适用与WEB
global-session

Bean生命周期管理,Spring提供3中方式,interface-based, method-based, and annotation-based

1          Spring实例化bean
2          Spring注入bean的属性
3          如果bean实现了BeanNameAware,Spring会执行setBeanName()
4          如果bean实现了BeanFactoryAware,Spring会执行setBeanFactory()
5          如果bean实现了ApplicationContextAware,Spring会执行setApplicationContext()
6          如果bean实现了BeanPostProcessor,Spring会执行postProcessBeforeInitialization()
7          如果bean实现了 InitializingBean,Spring会执行afterPropertiesSet(),类似如果声明了 init-method,会执行自定义的方法
8          如果bean实现了BeanPostProcessor,Spring会执行postProcessAfterInitialization()
9          bean保持在ApplicationContext中,直到应用关闭
10         如果bean实现了 DisposableBean,Spring会执行destroy(),类似如果声明了 destroy-method,会执行自定义的方法

可以使用 init-method 和  destroy-method 定义bean在初始化和销毁时要执行的方法。
<bean id="auditorium"    class="com.springinaction.springidol.Auditorium"
                     init-method="turnOnLights"
                     destroy-method="turnOffLights"/>
如果有的多个bean 需要用 init-method 和  destroy-method 。可以:
<?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/spring-beans-3.0.xsd"
default-init-method="turnOnLights"
default-destroy-method="turnOffLights">
</beans>

也可以用注解: @PostConstruct,@ PreDestroy

BeanNameAware 接口,可以实现 BeanNameAware接口,其中有个setBeanName(String),Spring会在配置完成Bean之后,其他初始化方法之前,调用setBeanName(String),把Bean 名称注入。

ApplicationContextAware,可以获得ApplicationContext的引用






















本文转载自:http://blog.csdn.net/yanliang1/article/details/10555909

fokYaland
粉丝 4
博文 68
码字总数 3062
作品 0
东城
私信 提问
Spring IoC & DI

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

classfly
2018/06/18
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
Spring IoC(更新中)

概念 IoC(控制反转,也叫依赖注入DI)是Spring的核心,几乎Spring的所有组件都要建立在此基础之上,包括AOP,声明式事务,SpringMVC等等。那么IoC的主要目的是什么呢?两个字“解耦”。为什么...

互联网小龙虾
2014/03/04
0
0
三分钟轻松了解Spring框架基础知识

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

爱尚实训
2018/07/22
0
0
spring学习3-Ioc和DI的简单介绍

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

大嘴吃鸡腿
2014/03/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins基础入门-5-用户和权限管理

本篇,我们来介绍下Jenkins上如何创建用户,以及如何管理用户,和那些用户可以有ProjectA的权限。这个很好理解,一个项目,有开发和测试,和运维,每个团队都有不同的角色,例如有测试经理和...

shzwork
10分钟前
0
0
linux上解压版安装jdk,tomcat

需要的安装包 1.vmware12 2.centos7版本 3.安装完成后需要xshell来连接远程虚拟机,虚拟机保证要联网,网络畅通。 4.xftp用来向linux传输文件用,一般来说xshell和xftp配套使用 5.对应的压缩...

architect刘源源
46分钟前
24
0
使用 spring 的 IOC 解决程序耦合

工厂模式解耦 在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时...

骚年锦时
今天
2
0
group by分组后获得每组中时间最大的那条记录

用途: GROUP BY 语句用于 对一个或多个列对结果集进行分组。 例子: 原表: 现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。 我们使用下列 SQL 语句: SELECT ID,US...

豆花饭烧土豆
今天
3
0
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部