spring属性注入DI

spring setter方式注入:

 

注入对象属性

前提:

在bean对应实体中有对应的setter方法。

基础代码:

在bean中有另一个bean属性的setter方法。

package cn.itcast.dao.impl;

import cn.itcast.dao.PersonDao;

public class PersonDaoBean implements PersonDao {

    public void add(){
        System.out.println("执行PersonDaoBean中的add()方法");
    }
}

package cn.itcast.service.impl;

import cn.itcast.dao.PersonDao;
import cn.itcast.service.PersonService;

public class PersonServiceBean implements PersonService {

    private PersonDao personDao;
    
    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }

    public PersonDao getPersonDao() {
        return personDao;
    }
    
    public void save(){
        personDao.add();
    }
    
    
}
View Code

ref方式注入:

<bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean"></bean>
    <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
        <property name="personDao" ref="personDao"></property>           
    </bean>
    name:注入的属性
    ref:值所对应的bean的id

 

内部类方式::

<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
                   <property name="personDao">
                       <bean class="cn.itcast.dao.impl.PersonDaoBean"/>
                   </property>
     </bean>

 

两种方式的比较:

  前者的bean可以被其他bean使用,后者的内部bean不能被其他bean使用

 

基本数据类型的注入

<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
                   <property name="personDao" ref="personDao"></property>
                   <property name="name" value="itcast"/>
                   <property name="id" value="12"/>
        </bean>

 

集合属性的注入

准备工作:

    public class PersonServiceBean implements PersonService {
    private PersonDao personDao;
    private Set<String> sets=new HashSet<String>();
    private List<String> lists=new ArrayList<String>();
    private Properties properties=new Properties();
    private Map<String,String> maps=new HashMap<String,String>(); 
    。。。
    }
View Code

 

 <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
                   <property name="personDao" ref="personDao"></property>
                   <property name="sets">
                       <set>
                           <value>第一个</value>
                           <value>第二个</value>
                           <value>第三个</value>
                       </set>
                   </property>
                   <property name="lists">
                       <list>
                           <value>第一</value>
                           <value>第二</value>
                           <value>第三</value>
                       </list>
                   </property>
                   <property name="properties">
                       <props>
                           <prop key="key1">value1</prop>
                           <prop key="key2">value2</prop>
                           <prop key="key3">value3</prop>
                       </props>
                   </property>
                   <property name="maps">
                       <map>
                           <entry key="key1" value="value1"/>
                           <entry key="key2" value="value2"/>
                           <entry key="key3" value="value3"/>
                       </map>
                   </property>
           </bean>

 

构造器注入

public PersonServiceBean(PersonDao personDao,String name){
        this.personDao=personDao;
        this.name=name;
    }
 
 
        <bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean"></bean>
        <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
                   <constructor-arg index="0" type="cn.itcast.dao.PersonDao"  ref="personDao"/>
                   <constructor-arg index="1"  value="....."/>
         </bean>   

注意:如果写了type,type对应的不是bean对象对应的实际type而是你的构造器中的参数的实际type。

 

field注入:(注解注入)

准备工作:

spring使用注解要先加入声明:

xmlns:context="http://www.springframework.org/schema/context"
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd

启动注解配置:
<context:annotation-config/>

 

例子:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
          <context:annotation-config/>

这个配置隐式注入了多个对注释进行解析处理的处理器。

 

注入注解:

@Autowired(required=""):按类型装配
required属性类型为boolean,默认值为false,如果写为true的话,装配失败会报异常,如果为false,装配失败会装配null进去

@Resource(name=""):
name属性给了值的话直接查找对应的bean进行注入,如果name没有给值,先将name当成字段名在beans中查找,找不到再按类型查找对应的类型的bean进行注入

两个注解都可以写在属性上,也可以写在属性的setter方法上

@Autowired private PersonDao personDao;

@Resource(name="personDao") private PersonDao personDao;

按名称装配还可以这样写:
@AutoWried(required=true) @Qualifier(value="xxx")
前面学习注解的时候说过:注解中如果变量名为value的话,使用的时候可以省略掉value=

 

自动装配
了解即可,不建议使用,因为结果具有不可预知性。
例子:
<bean id="..." class="..." autowire="byType"/>
autowire属性取值如下:
byType对应上面的@AutoWried
byName对应上面的@Resource
constructor与byType类似,应用于构造参数,如果容器中没有找到匹配的bean,会抛出异常
autodetect:通过bean类的自省(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

注意一点:
如果装配找到多个匹配的bean,也会抛出异常。

 

posted @ 2016-09-26 22:00  guodaxia  阅读(222)  评论(0编辑  收藏  举报