Spring 中设置依赖注入

package com.ysq.vo;
public class User {
    private int uid;
    private String uname;
    private String pwd;
    private Date birth;
    private String[] likes;  //声明一个数组
    private List<String> list; //声明一个集合
    private Map<String, String> map;   //声明一个map
    public User() {
        super();
    }
    public User(String uname, String pwd) {
        super();
        this.uname = uname;
        this.pwd = pwd;
    }
    public User(int uid, String uname, String pwd) {
        super();
        this.uid = uid;
        this.uname = uname;
        this.pwd = pwd;
    }

    public User(String uname, String pwd, Date birth) {
        super();
        this.uname = uname;
        this.pwd = pwd;
        this.birth = birth;
    }
   以省略了对应的get,set方法
}

1. Constructor injection 构造函数注入

1.1 在Bean的配置文件中,使用<constructor-arg>来表示将使用Constructor injection,由于使用Constructor injection时并不如Setter injection时拥有setXXX()这样易懂的名称,所以必须指定参数的位置索引,index属性就是用于指定对象将注入至建构函式中的哪一个参数,参数的顺序指定中,第一个参数的索引值是0,第二个是1,依此类推。 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
 <beans>
     <!-- 构造函数注入 --><bean id="cons_3" class="com.ysq.vo.User"> <constructor-arg index="0" value="111"/> <constructor-arg index="1" value="李四"/> <constructor-arg index="2" value="1212"/></bean> </beans>

1.2 如果constructor上只有一个参数,则不必指定index属性。 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
 <beans>
    <!-- 构造函数注入 -->   <bean id="cons_4" class="com.ysq.vo.User">        <constructor-arg value="李四"/>   </bean>
 </beans>

1.3 若有两个以上的参数,而参数类型各不相同的话,可以使用type来指定constructor上的参数类型。 示例代码

配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
 <beans>
     <!-- 构造函数注入 --><bean id="cons_4" class="com.ysq.vo.User"> <constructor-arg type="java.lang.Integer">   <value>1111</value> </constructor-arg> <constructor-arg type="java.lang.String"> <value>张三</value> </constructor-arg> <constructor-arg type="java.lang.String"> <value>112222</value> </constructor-arg></bean></beans>

2. property injection (通过属性注入)

2.1 直接指定值或是使用<ref>直接指定参考至其它的Bean 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

 <beans>
     <bean id="dateBean" class="java.util.Date"/>

     <bean id="helloBean"  class="com.ysq.vo.User">         <property name="uname">
             <value>张三!</value>
         </property>
         <property name="birth">
             <ref bean="dateBean"/><!--引入bean文件-->
         </property>
     </bean>
 </beans>

2.2 也可以用内部Bean的方式来注入依赖关系 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

 <beans>
     <bean id="helloBean" class="org.sixsun.spring.HelloBean">
         <property name="uname">
             <value>Hello!</value>
         </property>
         <property name="date">
             <bean id="dateBean" class="java.util.Date"/>
         </property>
     </bean>
 </beans>

3. 自动绑定

直接指定值或是使用<ref>直接指定参考至其它的Bean,Spring也支持隐式的自动绑定,您可以通过类型(byType)或名称(byName)将Bean绑定至其它Bean上对应的属性: 3.1 byType 在配置文件中,并没有指定helloBean的Date属性,而是透过自动绑定,由于autowire指定了byType,所以会根据helloBean 的 Date属性所接受的类型,判断是否有类似的类型对象,并将之绑定至helloBean的Date属性上,如果byType无法完成绑定,则抛出 org.springrframework.beans.factory.UnsatisfiedDependencyExcpetion异常。 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

 <beans>
     <bean id="dateBean" class="java.util.Date"/>
     <bean id="helloBean"
            class="com.ysq.vo.User"           autowire="byType">
         <property name="uname">
             <value>Hello!</value>
         </property>
     </bean>
 </beans>

3.2 byName 也可以指定byName来绑定,则Spring会根据bean的别名与属性名称是否符合来进行自动绑定,举个例子来说,如果是byName而Date属性要完成依赖注入的话,则必须修改一下第一个Bean的id值为date: 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

 <beans>
     <bean id="date" class="java.util.Date"/>
     <bean id="helloBean"
           class="com.ysq.vo.User"           autowire="byName">
         <property name="uname">
             <value>Hello!</value>
         </property>
     </bean>
 </beans>

3.3 constructor也可以尝试进行自动绑定 由于autowire设定为constructor,在建立绑定关系时,Spring容器会试图比对容器中的Bean及相关的建构方法,在类型上是否有符合,如果有的话,则选用该建构方法来建立Bean实例,例如上例中,HelloBean的带参数建构方法与date这个Bean的类型相符,于是选用该构造方法来建构实例,并将date这个Bean注入给它,如果无法完成绑定,则抛出 org.springframework.beans.factory.UnsatisfiedDependencyException异常。 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

 <beans>
     <bean id="date" class="java.util.Date"/>
     <bean id="helloBean"
           class="com.ysq.vo.User"           autowire="constructor">
         <property name="uname">
             <value>Hello!</value>
         </property>
     </bean>
 </beans>

3.4 autodetect 使用autodetect时,会尝试使用constructor,然后使用byType,哪一个先符合就先用。 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

 <beans>
     <bean id="date" class="java.util.Date"/>
     <bean id="helloBean"
           class="com.ysq.vo.User"           autowire="autodetect">
         <property name="uname">
             <value>Hello!</value>
         </property>
     </bean>
 </beans>

3.5 其它: 隐式的自动绑定没办法从配置文件中清楚的看到是否每个属性都完成设定,我们可以加入相依检查,在<bean>上加入dependency- check,有四种相依检查方式:simple、objects、all、none。 simple只检查简单的属性,像是原生(primitive)数据型态或字符串对象; objects检查对象属性; all则检查全部的属性; none是预设,表示不检查相依性; 示例配置:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

 <beans>
     <bean id="date" class="java.util.Date"/>
     <bean id="helloBean"
           class="com.ysq.vo.User"           autowire="autodetect"
           dependency-check="all">
         <property name="uname">
             <value>Hello!</value>
         </property>
     </bean>
 </beans>

4. 集合对象注入:

对于像数组、java.util.List、java.util.Set、java.util.Map等集合对象,在注入前必须填充入一些对象至集合中,然后再将集合对象注入至所需的Bean中,例如若有个Bean如下:

示例代码:

public class SomeBean {
     private String[] someStrArray;
     private SomeObj[] someObjArray;
     private List someList;
     private Map someMap;
     ....

 }

示例配置:

<beans>
     <bean id="someBean" class="onlyfun.caterpillar.SomeBean">
         <property name="someArray">
             <list>
                 <value>Hello!Justin!</value>
                 <value>Hello!Momor!</value>
                 <value>Hello!Bush!</value>
             </list>
         </property>
         <property name="someObjArray">
             <list>
                 <ref bean="someObj1"/>
                 <ref bean="someObj2"/>
             </list>
         </property>
         <property name="someList">
             <list>
                  <value>Hello!Justin!</value>
                  <ref bean="someObj1"/>
                  <ref bean="someObj2"/>
             </list>
         </property>
         <property name="someMap">
             <map>
                  <entry key="somekey1">
                      <ref bean="someObj1"/>
                  </entry>
                  <entry key="somekey2">
                      <value>Hello!Justin!</value>
                  </entry>
             </map>
         </property>
     </bean>
 </beans>

上面的Bean定义文件是个综合示范,数组与List对象都是用<list>卷标来设定,而Map对象使用<map>卷标设定,并需要一个key值设定。 Set的使用<set>标签,例如:

<set>
     <value>a set element</value>
     <ref bean="otherBean"/>
     <ref bean="anotherBean"/>
 </set>

您也可以注入java.util.Properties,Bean定义档的写法示范如下:

<bean id=....>
         ....
         <property name="someProperties">
             <props>
                 <prop key="someProkey1">
                     someProValue1
                 </prop>
                 <prop key="someProkey2">
                     someProValue2
                 </prop>
             </props>
         </property>
     </bean>
时间: 2024-10-16 08:15:47

Spring 中设置依赖注入的相关文章

JavaEE开发之Spring中的依赖注入与AOP编程

一.快速创建Mava管理的Spring工程 因为本篇博客是讨论关于Spring的东西,所以我们就不创建WebApp的工程了.我们使用Spring来快速的创建一个Maven管理的工程.如下所示找到File->New->Maven Project选项来创建一个新的Maven Project,具体如下所示: 下方我们选择创建一个简单的Maven工程,跳过模板的选择.上篇博客我们在创建Maven工程时,是没有选择下方这个选项的,然后我们选择了一个WebApp的模板.而本篇博客,我们不需要WebApp的

类比Spring框架来实现OC中的依赖注入

如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Control)的实现方式之一,另外一种是依赖查找(DL: Dependency Lookup).当然在Spring框架中主要使用到了控制反转中的依赖注入这种方式.当然在Spring框架中除了依赖注入外,还有一个重要的概念那就是面向切面编程(AOP). 简单的说,依赖注入负责往类中注入依赖对象,而面向切

spring四种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种

spring 四种依赖注入方式以及注解注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化, 而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员, 而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种依赖注

SignalR中的依赖注入

什么是依赖注入? 如果你已经熟悉依赖注入可以跳过此节. 依赖注入 (DI) 模式下,对象并不为自身的依赖负责. 下边的例子是一个主动 DI. 假设你有个对象需要消息日志.你可能定义了一个日志接口: C# interface ILogger { void LogMessage(string message); } 在你的对象中,你可以创建一个 ILogger来记录消息. C# // 不用依赖注入. class SomeComponent { ILogger _logger = new FileLo

spring四种依赖注入方式 (set,构造器,工厂,注解 )

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种

spring中Bean的注入类型

1.属性注入    即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式.    属性注入要求Bean提供一个默认的构造参数,并为需要注入的属性提供对应的Setter方法.Spring先调用Bean的默认构造参数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值.    需要指出的是:Spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性变量则不做要

ASP.NET Core中的依赖注入(2):依赖注入(DI)

参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/project-layout.html http://www.yuanjiaocheng.net/ASPNET-CORE/projectjson.html http://www.yuanjiaocheng.net/ASPNET-CORE/core-configuration.html http://www.yuanjiaocheng.net/ASPNET-CORE/core-middleware.htm

转: 理解AngularJS中的依赖注入

理解AngularJS中的依赖注入 AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在.在本文中我们将会解释AngularJS依赖注入系统是如何运行的. Provider服务($provide) $provide服务负责告诉Angular如何创造一个新的可注入的东西:即服务(service).服务会被叫做provider的东西来定 义,你可以使用$provide来创建一个provider.你需要使用$provide中的provider方法来定义一个provi