• Spring--Bean的配置


    一、bean的名字

      使用id属性  推荐使用

    <bean id="stu1" class="spring02.entity.Student">
        <property name="id" value="1001" />
    </bean>

      使用name

    <bean name="stu1" class="spring02.entity.Student">
        <property name="id" value="1001" />
    </bean>

      alias 给bean取别名

    <alias name="stu1" alias="zhangsan" />

    注意:配置一个Student的bean Student: 两个名字, id/name 

      id与name: id:  不能使用特殊符号, 字母+数字  推荐
      name:使用特殊符号
      如果一个bean没有配置id,name这个bean的名字: 以class作为name
      如果一个类配置多个bean, 没有使用id,name, 名字: 以class#序号

      同一个bean可以同时存在id和name

    <bean id="dog" name="dog1,dog2,dog3" class="org.suke.Dog" /> 
    <alias name="dog" alias="dog4"/> 
    这样dog对象就被被标识为 dog,dog1,dog2,dog3,dog4这4个标识名

    二、依赖注入三种方式

    1、属性setter方法注入

      在<bean>标签使用<property>子标签给属性注入

    要求:这个属性必须提供set方法

    语法:
    property标签的属性:        name:属性名       value/ref : 给属性赋值,   
    value: String+基本数据类型 Ref: 类类型, 是bean的id

    applicationContext.xml 代码:

    <bean id="stu1" class="spring02.entity.Student" name="stu">
        <!-- 调用的set方法名: set+name: setId() setId1() -->
        <property name="id" value="1001" />
        <property name="name" value="张三" />
        <property name="sex" value="男" />
        <property name="age" value="21" />
        <!-- 对象: ref -->
        <property name="address" ref="address1" />
    </bean>
    
    <!-- Address的bean -->
    <bean id="address1" class="spring02.entity.Address">
        <property name="city" value="深圳" />
        <property name="cod" value="421101" />
    </bean>

    student实体类:

    public class Student {
        private Integer id;
        private String name;
        private String sex;
        private Integer age;
        /*对象属性*/
        private Address address;

    2、构造器参数注入

      在<bean>标签使用<constructor-arg>子标签给属性注入

    要求:这个属性必须提供对应的有参构造方法(其中必须再次创建一个无参构造方法)

    语法:
    constructor-arg:标签的属性:        name:属性名       value/ref : 给属性赋值,   
    value: String+基本数据类型     Ref: 类类型, 是bean的id
    index: 参数的位置: 从0开始
    type: 参数类型, 一个构造方法,有相同的数据类型的参数, 只使用type没办法确定,
    (如果实体类中只有一个此类型可以使用,或者联合name一起使用)

    构造方法有几个属性定义几个:constructor-arg

    <!-- 通过构造方法给属性赋值 调用 一个参数的构造方法 -->
        <bean id="stu3" class="spring02.entity.Student">
            <constructor-arg name="name" value="王五" />
        </bean>
    <!--实体类中的构造方法--> public Student(String name) {   this.name = name; }

    给一个全部参数的构造方法注入值:

    <bean id="stu4" class="spring02.entity.Student">
        <constructor-arg name="name" value="赵六" />
        <constructor-arg index="0" value="1001" />
        <constructor-arg type="java.lang.String" name="sex"  value="男" />
        <constructor-arg name="age" value="22" />
        <constructor-arg name="address" ref="address1" />
    </bean>

    3、接口方式的注入(只在spring内部使用)

      Spring 内部提供很多符合接口注入API (ApplicationContextAware )

    三、spEL表达式

      Spring 3.0之后,增强spring配置,提供 Spring Expression Language 语言 (spEL )

    语法 #{表达式}

    spring表达式 与 el 表达式的区别

      #{}  获取属性, 也可以调用方法

      El表达式:  ${}  获取属性,不能调用对象的方法

      #{beanId.属性名}
    <bean id="stu5" class="spring02.entity.Student">
        <property name="name" value="#{stu4.name.substring(1)}" />
    </bean>

    四、 p名称空间的使用

      Spring2.5 版本之后,为了简化属性setter依赖注入,提供虚拟名称空间 p

    第一步:需要映入xml配置

    xmlns:p="http://www.springframework.org/schema/p"

    第二步: 在bean标签中, 使用p:属性名

    <!-- 使用p命名空间给属性赋值 ,本质还是使用set方法给属性赋值 p:id="1005" 等同于: <property name="id"  value="1005" /> -->
    <bean id="stu6" class="spring02.entity.Student" p:id="1005"   p:name="李琦" p:address-ref="address1"></bean>

    五、Bean的作用域(Scope)

      Spring默认管理Bean是单例模式: 在bean使用scope属性,修改的bean的模式

    <!-- 集合属性的注入
     scope="prototype": 这个bean是多例, 每次从Spring容器获取这个bean, 重新创建一个-->
    <bean id="stu7" class="spring02.entity.Student" scope="prototype">

    注意: Spring管理Struts2 Action对象,需要配置 prototype ! 

    六:集合类型属性注入

    主要用于 参数配置,(通过set方法)

    •   数组或者List ----- <list>或者 <array>注入
    •   Set ---- <set> 注入
    •   Map --- <map> <entry> 注入
    •   Properties --- <props> <prop> 注入

    1、数组或者List

    <!-- java对象,创建set/get方法-->
    //数组类型属性
    private String[] arr;
    //List集合
    private List<Integer> list = new ArrayList<>();
    <!-- applicationContext.xml -->
    <bean id="stu7" class="spring02.entity.Student">
        <property name="arr">
            <!-- <array> array或者list都可以
                <value>aaa</value> 
                <value>bbb</value>
                </array> -->
            <list>
                <value>aaa</value>
                <value>bbb</value>
            </list>
        </property>
    <!-- List属性 -->
        <property name="list">
            <list>
                <value>1</value>
                <value>2</value>
            </list>
        </property>
    </bean>

    2、Set集合

    <!-- java对象,创建set/get方法-->
    private Set<Integer> set = new HashSet<>();
    <!-- applicationContext.xml-->
    <!-- Set  :去重-->
    <property name="set">
        <set>
            <value>1</value>
            <value>1</value>
            <value>2</value>
        </set>
    </property>

    3、Map集合

    <!-- java对象,创建set/get方法-->
    private Map<String,String> map = new HashMap<>();
    <!-- applicationContext.xml-->
    <!-- Map  :key 唯一 -->
    <property name="map">
        <map>
            <entry key="k1" value="v1"/>
            <entry key="k2" value="v2"/>
            <entry key="k3" value="v3"/>
            <entry key="k1" value="v3"/>
        </map>
    </property>

    4、Properties

    <!-- java对象,创建set/get方法-->
    private Properties props = new Properties();
    <!-- applicationContext.xml-->
    <!-- Properties : key,Value都是String -->
    <property name="props">
        <props>
            <prop key="p1">v1</prop>
            <prop key="p2">v2</prop>
            <prop key="p3">v3</prop>
        </props>
    </property>
  • 相关阅读:
    加快火狐启动速度的几种方法 Leone
    我国的社保到底是多交好,还是少交好? Leone
    “情商”和“智商”究竟有哪些区别? Leone
    Atitti 知识图谱构建方法attilax 总结
    Atitit 知识图谱的数据来源
    Atitit java 二维码识别 图片识别
    Atitit 跨平台异常处理(2)异常转换 java c# js异常对象结构比较and转换
    Atitit 异常机制与异常处理的原理与概论
    Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离
    屏幕取词技术实现原理
  • 原文地址:https://www.cnblogs.com/64Byte/p/13080384.html
Copyright © 2020-2023  润新知