Bean相关的配置

  • < bean >标签的idname的属性配置
    id:使用了约束的唯一约束,并且里面不能出现特殊字符(如 / )
    name:没有使用约束中的唯一约束(理论上是可以重复的,但实际上不允许),里面可以出现特殊字符。
    例如:Spring和Struts1框架整合的时候,Struts1 将action 托管给Spring框架,带入字符, < bean name=”/user” class=””/>。
Bean的生命周期

可以在ApplicationContext.xml中配置Bean的初始化方法以及销毁方法

init-method:Bean被初始化的时候执行的方法
destroy-method:Bean被销毁的时候执行的方法(Bean默认是单例创建,工厂关闭)

< bean name=“Service” class=“demo.ServiceImpl” init-method=“init” destroy-method=“destroy”>

同时需要在被托管的类中写 init 方法和 destroy 方法

public void init(){
  System.out.println("类被初始化啦");
}

 public void destroy() {
   System.out.println("类被销毁啦");
}
Bean的作用范围的配置
  • scope:Bean的作用范围
  • singleton:默认的,Spring会采用单例模式创建这个对象。
  • prototype:多例模式。(Struts2和Spring整合一定会用到)
  • request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
  • session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
  • globalsession:应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
<bean name="Service" class="demo.ServiceImpl" scope="singleton">
属性的注入方式

如何修改spring bean的属性 spring配置bean的id属性可以重复吗_属性注入

  • 构造方法的属性注入:
    需要先在类中写一个有参的构造方法,然后再在配置文件中设置:
<bean name="Service" class="demo.ServiceImpl">
     <!--构造方法的依赖注入,给属性赋值,需要先在类中写有参构造方法-->
     <constructor-arg name="name" value="kk1"/>
     <constructor-arg name="age" value="18"/>
 </bean>
  • set方法的属性注入:

需要在类中提供相应属性的setXXX()方法,然后再在配置文件中使用value属性配置值。

value:设置普通类型的值

<bean name="Service" class="demo.ServiceImpl"">
        <!--DI的基本配置,set方式依赖注入,给类里面的属性赋值-->
        <!--需要在类中提供属性的Set方法-->
        <property name="name" value="kk" />
        <property name="age" value="kk" />
    </bean>

当依赖注入的类中有对象成员的时候,需要使用到 ref属性 来给对象成员赋值。

有user类和car类,car类是user类中的成员。

car类:

public class car {
    String name;
    String price;
    public void setName(String name) {
        this.name = name;
    }
    public void setPrice(String price) {
        this.price = price;
    }
}

user类:

public class user {
    String name;
    car car;

    public void setName(String name) {
        this.name = name;
    }
    public void setCar(demo.car car) {
        this.car = car;
    }
}

需要将两个类都托管在Spring中,也就是在xml中配置类,然后使用 ref 属性为 user 类注入 car 成员。

相当于是引用了 car 类的属性注入,再为自己的成员进行属性注入。

<bean name="car" class="demo.car">
        <property name="name" value="baoma" />
        <property name="price" value="10000" />
    </bean>
    
    <bean name="user" class="demo.user">
        <!--car,是对象成员,ref:设置其它的类的id或者name,相当于引用别的类-->
        <property name="name" value="kk" />
        <property name="car" ref="car" />
    </bean>

构造方法设置对象属性也是一样,同样在< constructor-arg>标签中使用ref属性进行设置。

< constructor-arg name=“car” ref=“car”/>

P名称空间的属性注入
  • 通过引入P:名称空间完成属性的注入
  • 普通属性: p:属性名 = “值”
  • 对象属性: p:属性名-ref = “值”

首先,先需要在xml的< beans>标签中添加一行代码,声明 p 名称空间

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

将刚刚的user,car案例改一下注入方式:

<bean name="car" class="demo.car" p:name="baoma" p:price="12550"/>

<bean name="user" class="demo.user" p:name="kk" p:car-ref="car"/>
SpEL的属性注入
  • SpEL:Spring Expression Language,Spring的表达式语言
  • 语法:#{SpEL}

< property name=“count” value="#{5}" />

在< property>元素的value属性中使用 #{} 界定符将值装配到Bean的属性中。

<!--SpEL的属性注入方式-->
<bean name="car" class="demo.car">
    <property name="name" value="#{baoma}"></property>
    <property name="price" value="#{1800}"></property>
</bean>

<bean name="user" class="demo.user">
    <property name="name" value="#{an}"/>
    <!--car 指向的是另个一个bean对象-->
    <property name="car" value="#{car}"/>
</bean>

可以装配以下类型:

  • 浮点型数字:#{89.7}
  • 科学计数法:#{1e4}
  • 字符或者字符串:#{‘moonlit’},{“moonlit”}
  • 布尔值:#{true}
  • bean的对象:#{car}
  • 其他类的成员:#{car.name}
  • 其他类的方法:#{car.getName()}
  • 运算或者字符串拼接:#{car.getPrice + 100},#{car.getName + car.getPrice}
  • 正则表达式匹配:#{car.getEmail matches ‘[a-zA-Z0-9.%+]+@[a-zA-Z0-9.-]+\.com’},matches 是关键字
注入复杂类型(集合,数组)

如果bean对象的成员是 数组,集合等,可以通过相对应的标签,往这些复杂类型的成员中依次注入值。

一样的也需要为各个成员配置getXXX 方法,以便Spring可以获取到。

基本类型的值使用value标签注入

对象类型的值使用ref标签 注入,还需要在Spring容器中配置相应Bean

CollectionBean类:

public class CollectionBean {
    private String[] arrs;
    private List<String> list;
    private Set<String> set;
    private Map<String,String>map;

    @Override
    public String toString() {
        return "CollectionBean{" +
                "arrs=" + Arrays.toString(arrs) +
                ", list=" + list +
                ", set=" + set +
                ", map=" + map +
                '}';
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setList(List<String> list) {
        this.list = list;
    }
    
    public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }

}

配置文件:

<bean id="CollectionBean" class="demo2.CollectionBean">
        <!--数组类型-->
        <!--如果是数组里存放的是对象类型的成员,就使用ref标签-->
        <!--用list标签,和list集合类型一样,使用value标签注入成员-->
        <property name="arrs">
            <list>
                <value>王东1</value>
                <value>王东2</value>
                <value>王东3</value>
                <!--<ref>car</ref>-->
            </list>
        </property>

		<!--对象数组类型-->
        <!--使用ref标签,指定bean名称,注入car对象数组,car对象需要在Spring中配置-->
        <property name="cars">
            <list>
                <ref bean="car"></ref>
            </list>
        </property>

        <!--注入集合类型-->
        <!--如果是集合里存放的是对象类型的成员,就使用ref标签-->
        <!--用list标签,和数组一样,使用value标签注入成员-->
        <property name="list">
            <list>
                <value>kk1</value>
                <value>kk2</value>
                <value>kk3</value>
            </list>
        </property>

        <!--注入set类型-->
        <!--使用set标签,使用value标签注入成员-->
        <property name="set">
            <set>
                <value>jj1</value>
                <value>jj2</value>
                <value>jj3</value>
            </set>
        </property>

        <!--注入map集合-->
        <!--使用map标签-->
        <!--使用entry标签注入key成员,用value标签注入对应的value成员-->
        <!--如果key是对象类型,那么使用key-ref标签,如果是value是对象类型,那么使用value-ref标签-->
        <property name="map">
            <map>
                <entry key="aa">
                    <value>hh</value>
                </entry>
                <!--或者是-->
                <entry key="aa1" value="hh1"/>
                <entry key="aa2" value="hh2"/>
            </map>
        </property>

 </bean>