Spring Bean 作用域以及三种xml基本注入方式总结

Spring Bean 作用域

默认提供5中作用域

  1. singleton(默认)
    Spring的ApplicationContext容器在启动时候,自动实例化所有的singleton的bean并缓存于容器当中。
  2. prototype
    每次从容器调用bean时候,都会返回一个新的实例,每次调用getBean()时相当于执行new Bean()的操作。

当用户使用Spring的 WebApplicationContext时,还可以使用另外3中Bean的作用域,即request,sessionglobalSession

Spring Schema配置格式

Spring1.0采用DTD格式

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"  
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">  

dtd 声明,表示该XML里元素和属性等符合spring-beans-2.0.dtd这个文档类型定义标准。
由于DTD有些局限性,比如不支持命名空间。

XML Schema

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
</beans>

XML Schema命名空间作用:

  1. 避免命名空间冲突,类似Java中的package
  2. 将不同标签分类。比如aop是针对aop的标签

代码解释 :

  • xmlns="http://www.springframework.org/schema/beans"声明xml文件默认命名空间,表示未使用其他命名空间的所有标签的默认命名空间
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"声明XML Schema实例,声明后就可以使用schemaLocation属性了。
  • xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    指定Schema的位置这个属性必须结合命名空间使用。这个属性有两个值.第一个表示需要使用的命名空间。第二个表示供命名空间使用的XML Schema的位置。
    xsi:schemaLocation的含义是如果需要找http://www.springframework.org/schema/beans命名空间定义,使用版本http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

Bean 基本配置

  1. 属性注入
  • 基本值注入
<bean id="xmlbean" class="com.wuyue.XmlBean">
        <property name="name" value="mamba"></property>
</bean>
public class XmlBean {
    private String name;

    public String getName() {
        return name;
    }

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

这里定义private String name是非必须的, Bean 容器会找到setName进行注入。

  • 对象类型注入
<property name="node">
     <ref bean="node"></ref>
</property>
 <bean id="node" class="com.wuyue.Node">
        <property name="name" value="heimanba"></property>
</bean>
  • 使用p命名空间注入
// 使用p命名空间之前
<bean id="xmlbean" class="com.wuyue.XmlBean">
    <property name="name">
            <value>dankun</value>
     </property>
</bean>
// 使用p之后
<bean id="xmlbean" class="com.wuyue.XmlBean" p:name="dankun2">
</bean>
  1. 构造方法注入
  • 基本使用
<bean id="xmlbean" class="com.wuyue.XmlBean">
        <constructor-arg value="dankun"></constructor-arg>
    </bean>
public class XmlBean {
    private String name;

    public XmlBean(String name) {
        this.name = name;
    }
}
  • 按照类型匹配入参
<constructor-arg value="dankun" type="java.lang.String"></constructor-arg>
  • 按照索引匹配入参
<bean id="xmlbean" class="com.wuyue.XmlBean">
    <constructor-arg  index="0" value="dankun" type="java.lang.String">      
    </constructor-arg>
    <constructor-arg  index="1" value="age" type="java.lang.String"> 
    </constructor-arg>
</bean>
  1. 工厂方法注入
    工厂方法注入,适用于将非Spring的代码或者第三方类库注入Spring容器进行管理。
public class CarFactory {
    public Car createBM() {
        Car car = new Car("宝马");
        return  car;
    }
}
<beans>
    <bean id="carFactory" class="com.wuyue.CarFactory"></bean>
    <bean id="car" factory-bean="carFactory" factory-method="createBM"></bean>
</beans>

当然最好的方式是静态工厂方法注入

public class CarFactory {
    public static Car createBM() {
        Car car = new Car("宝马");
        return  car;
    }
}
<beans>
    <bean id="car" class="com.wuyue.CarFactory" factory-method="createBM"></bean>
</beans>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容