• Spring——多种方式实现依赖注入


      在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性。Spring会从这里获取必要的信息来创建bean。

    但是,在XML中声明DI时,会有多种可选的配置方式和风格,具体到setter方式、构造器方式和P命名空间方式。

    一、使用setter进行注入

       

     二、使用构造注入 

    • 为POJO类创建带参的构造方法
    • 使用<constructor-arg>元素

      给原先的实体类添加构造,记得带着无参构造,这个问题在这里不细说

      

      Spring配置文件如下

    <bean id="student" class="com.cmy.entity.StudentBean">
        <!--constructor-arg:代表构造函数中的一个参数 索引从0开始-->
        <constructor-arg type="java.lang.String" value="呵呵"></constructor-arg>
        <constructor-arg type="int" value="16"></constructor-arg>
    </bean>

      注意:

         1、一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。

         2、通过<constructor-arg>元素的index 属性可以指定该参数的位置索引,位置 从0 开始。

         3、<constructor-arg>元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。

    三、使用P命名空间进行注入

    <bean id="student" class="com.cmy.entity.studentBean" p:name="呵呵" 
          p:age="16">
    </bean>

      注意:

        1、P命名空间注入的方式也是使用setter方式注入,所有POJO类中必须存在对应的set方法

        2、 使用前需要在Spring的配置文件中引入p命名空间 xmlns:p="http://www.springframework.org/schema/p"

          AOP也同样如此,不过在idea中可以使用ctrl+Enter自动引入  xmlns:aop="http://www.springframework.org/schema/aop"

    四、注入不同的类型

      

       这个关注第四点,POJO类如下:

    public class Datetype {
        //数组
        private  String[]   arrays;
        //list
        private List<Integer> lists;
        //set
        private Set<Integer> sets;
        //map
        private Map<String,String> maps;
        //配置
        private Properties pros;
    
        public String[] getArrays() {
            return arrays;
        }
    
        public void setArrays(String[] arrays) {
            this.arrays = arrays;
        }
    
        public List<Integer> getLists() {
            return lists;
        }
    
        public void setLists(List<Integer> lists) {
            this.lists = lists;
        }
    
        public Set<Integer> getSets() {
            return sets;
        }
    
        public void setSets(Set<Integer> sets) {
            this.sets = sets;
        }
    
        public Map<String, String> getMaps() {
            return maps;
        }
    
        public void setMaps(Map<String, String> maps) {
            this.maps = maps;
        }
    
        public Properties getPros() {
            return pros;
        }
    
        public void setPros(Properties pros) {
            this.pros = pros;
        }
    
        @Override
        public String toString() {
            return "Datetype{" +
                    "arrays=" + Arrays.toString(arrays) +
                    ", lists=" + lists +
                    ", sets=" + sets +
                    ", maps=" + maps +
                    ", pros=" + pros +
                    '}';
        }
    }

      大配置文件:

    <bean id="dateType" class="cn.spring.entity.Datetype">
    
            <property name="arrays">
                <array>
                    <value>hehe</value>
                    <value>haha</value>
                </array>
            </property>
    
            <property name="lists">
                <list>
                    <value>1</value>
                    <value>2</value>
                </list>
            </property>
    
            <property name="sets">
                <set>
                    <value>3</value>
                    <value>4</value>
                </set>
            </property>
    
            <property name="maps">
                <map>
                    <entry key="c" value="才"></entry>
                    <entry value="的" key="d"></entry>
                </map>
            </property>
    
            <property name="pros">
                <props>
                    <prop key="a">啊</prop>
                    <prop key="b">吧</prop>
                </props>
            </property>
    
        </bean>

      测试类:

          

      输出结果:

        

     五、域属性的自动注入

       在之前我们采用手动的域属性注入,即:

       

       这里采用自动注入,自动注入有两种方式:

      1.byName:保证域属性名字和bean的id一致

      2.byType:保证域属性的类型和bean的类型一致,与其相兼容的类型也不可以

      

  • 相关阅读:
    国内最火的3款前端开发框架
    Cordova是做什么的
    老师你好。使用cordova生成的hellowold 的安卓5.0版本太高。怎么才可以生成4.4的呢?
    一个类似bootstrap的foundation
    role在标签中的作用是什么?
    如何做到根据不同的进度用不同的颜色显示整个进度条
    wall 和panel有啥区别
    git ignore
    eclipse js 引用跳转
    计划
  • 原文地址:https://www.cnblogs.com/xiao-ran/p/11752780.html
Copyright © 2020-2023  润新知