• 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,也会抛出异常。

  • 相关阅读:
    Python程序中的线程操作-concurrent模块
    SVN Checkout 不包括源文件夹根目录(转)
    Windows下配置Nginx使之支持PHP(转)
    htaccess 正则规则整理(转)
    用htaccess进行访问控制(转)
    改写URL的查询字符串QUERY_STRING(转)
    htaccess URL重写rewrite与重定向redirect(转)
    URL重写:RewriteCond指令与RewriteRule 指令格式(转)
    开启.htaccess重写之前先来看看mod_rewrite(转)
    php导出excel不断刷新缓冲区的思路(转)
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5910887.html
Copyright © 2020-2023  润新知