Spring_Bean配置(1)

IOC和DI

IOC:反转控制,反转资源获取的方向。以前是组件向容器发起请求查找资源。IOC则是主动将资源推送给它所管理的组件,组件要做的就是选择一种合适的方式接收资源。

DI:依赖注入,依赖于容器把资源注入给我,(IOC的另一种表述方式)组件以预先定义好的方式(如setter)接收来自容器的资源。

Spring容器

Spring容器在读取配置文件创建Bean之前需要进行实例化,只有实例化之后才能从IOC容器里获取Bean的实例并使用。

Spring中提供了两种IOC容器的实现:

1、BeanFactory:IOC容器的基本实现,是Spring框架的基础设施,面向Spring本身

2、ApplicationContext:提供了更多高级的特性,是BeanFactory的子接口,面向开发者,几乎所有的场景都直接使用,而非使用底层的BeanFactory。

ApplicationContext主要有两种实现类:


其中的ConfigurableApplicationContext扩展于ApplicationContext,新增了两个方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的功能。

ClassPathXMLApplicationContext是从类路径下加载配置文件;FileSystemXMLApplicationContext是从文件系统中加载配置文件。 

public void test(){
    //HelloWorld helloWorld = new HelloWorld();

    //1、创建Spring的IOC容器——》调用构造器对配置文件中的bean进行初始化,
    /**
     * ApplicationContext:代表IOC容器
     * ClassPathXmlApplicationContext:是ApplicationContext的实现类,用于加载类路径下的配置文件
     */
    ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    //2、从IOC容器中获取bean的实例
    //用id定位到IOC容器中的Bean
    HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
    //3、调用方法
    helloWorld.print();
}


Spring注入方式:

1、属性注入:通过Setter方法注入Bean的属性值或依赖对象,是最常用的注入方式。

<!--
配置bean
id:唯一识别符,外部引用
class:bean的全类名,通过反射的方式在IOC容器中创建Bean,要求Bean中必须要有无参构造器
-->
<bean id="helloWorld" class="bean.HelloWorld">
    <property name="name" value="你厉害,你赚得多!"/>
</bean>

2、构造器注入:实体类Bean中必须要有构造函数,使用改方法可以设置注入的类型和位置,以区分重载的构造器

如果其中包含特殊字符可以使用  ![CDATA[  ]]  进行包装之后使用。

<!--构造器注入-->
<bean id="car" class="bean.Car">
    <constructor-arg value="英菲尼迪" index="0"/>
    <constructor-arg value="300" type="java.lang.Double"/>
</bean>

属性值还可以使用<value>子节点进行设置

<!--构造器注入-->
<!--如果包含特殊字符可以使用 ![CDATA[ ]]-->
<bean id="car" class="bean.Car">
    <constructor-arg value="英菲尼迪" index="0"/>
    <constructor-arg type="java.lang.Double">
        <value><![CDATA[390]]></value>
    </constructor-arg>
</bean>

3、工厂方法注入(很少用)


Bean之间的相互引用

<!--构造器注入-->
<!--如果包含特殊字符可以使用 ![CDATA[ ]]-->
<bean id="car1" class="bean.Car">
    <constructor-arg value="英菲尼迪" type="java.lang.String"/>
    <constructor-arg>
        <value>390</value>
    </constructor-arg>
</bean>

<bean id="person" class="bean.Person">
    <property name="name" value="Tom"/>
    <property name="age" value="24"/>
    <property name="car" ref="car1"/>
</bean>

配置集合属性

<!--配置集合属性-->
<bean id="boss" class="bean.Boss">
    <property name="name" value="Mike"/>
    <property name="age" value="22"/>
    <property name="cars">
        <list>
            <ref bean="car1"/>
            <ref bean="car1"/>
        </list>
    </property>
</bean>

properties属性

public class DataSource {
    private Properties properties;

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "DataSource{" +
                "properties=" + properties +
                '}';
    }
}
<!--配置Properties属性-->
<bean id="dataSource" class="bean.DataSource">
    <property name="properties">
        <props>
            <prop key="user">root</prop>
            <prop key="password">123456</prop>
            <prop key="url">jdbc:mysql://localhost:3306/----</prop>
            <prop key="driver">com.mysql.jdbc.Driver</prop>
        </props>
    </property>
</bean>


配置单例的集合bean,供多个bean使用

<!--配置单例的集合bean,以供多个bean进行引用-->
<util:list id="cars">
    <ref bean="car"/>
    <ref bean="car1"/>
</util:list>

P命名空间,对配置进行简化,相对于传统的方式更加简洁

<bean id="helloWorld" class="bean.HelloWorld">
    <property name="name" value="你厉害,你赚得多!"/>
</bean>

<bean id="hello" class="bean.HelloWorld"
      p:name="lallala"/>

原文地址:https://www.cnblogs.com/huangzhe1515023110/p/9276063.html