用最易懂的方式聊聊Spring是如何通过XML方式来管理Bean的

一、Bean的实例化方式

在XML方式下,Spring有三种途径来实例化Bean。

1.使用类的无参数构造函数来创建

这是最常见、最常用的实例化Bean的方式。假设现在有个类User

public class User {
    publicc void add() {
        System.out.println("add...");
    }
}

XML配置文件如下

 <bean id="user" class="cn.itcast.ioc.User"></bean>

代码中创建对象

public class Service{
    public void testUser(){
        // 1.加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");

        // 2.得到配置创建的对象
        User user = (User)context.getBean("user");
        ...
    }
}
2.使用静态工厂创建

创建类后,需要再创建一个静态工厂

public class User {
    publicc void add() {
        System.out.println("add...");
    }
}

//创建工厂类
public class userFactory {
    //静态方法,返回User对象
    public static User getUser(){
        return new User();
    }
}

配置文件

<bean id="user" class="cn.itcast.bean.BeanFactory" factory-method="getUser"></bean>

代码中创建对象

public class Service{
    public void testUser(){
        // 1.加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");

        // 2.得到配置创建的对象
        User user = (User)context.getBean("user");
        ...
    }
}
3.使用实例工厂创建

创建类后,需要再创建一个普通工厂

public class User {
    publicc void add() {
        System.out.println("add...");
    }
}

//创建工厂类
public class userFactory {
    //静态方法,返回User对象
    public User getUser(){
        return new User();
    }
}

配置文件如下

<bean id="userFactory" class="cm.itcast.bean.userFactory"></bean>
<bean id="user" factory-bean="userFactory" factory-method="getUser"></bean>

代码中创建对象

public class Service{
    public void testUser(){
        // 1.加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");

        // 2.得到配置创建的对象
        User user = (User)context.getBean("user");
        ...
    }
}

二、Bean标签常用属性

  • id属性。标识,代码中可根据id值得到配置对象;不能包含特殊符号
  • class属性。创建对象所在类的全路径
  • name属性。功能和id属性相同,但它里面可以包含特殊符号。现在已不常用
  • scope属性。Bean的作用范围:
    • singleton。默认值,单例的
    • prototype。多例的

三、属性注入

什么是属性注入? 创建对象时,对类里面属性设置值
对于普通的java类,有以下三种方式对类里面的属性设置值:

  • 有参数构造函数
  • set函数
  • 接口注入,用的比较少

接口注入举例:

public interface Dao{
    public void set(String name);
}

public class DaoImpl implements Dao{
    private String name;
    public void set(String name){
        this.name=name;
    }
}

在Spring框架里,只支持前面两种方式。下面分别对其进行说明

有参数构造函数
  • 创建类
public class PropertyDemo1{
    private String username;
    public PropertyDemo1(Sting username){
        this.name=name;
    }

    public void test1(){
        System.out.println("demo1..." + username);
    }
}
  • 配置文件
<bean id="demo1" class="cn.itcast.property.PropertyDemo1">
    <constructor-arg name="username" value="小王"></constructor-arg>
</bean>
  • 代码中创建对象
public class Service{
    public void testProperty(){
        // 1.加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");

        // 2.得到配置创建的对象
        User user = (User)context.getBean("demo1");
        ...
    }
}
Set方式
  • 创建类
public class PropertyDemo2{
    private String username;
    public void setUsername(String name){
        this.username=name;
    }

    public void test1(){
        System.out.println("demo2..." + username);
    }
}
  • 配置文件
<bean id="demo2" class="ccn.itcast.property.PropertyDemo2">
    <property name="username" value="小赵"></property>
</bean>
  • 代码中创建对象
public class Service{
    public void testProperty(){
        // 1.加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");

        // 2.得到配置创建的对象
        User user = (User)context.getBean("demo2");
        ...
    }
}

四、注入对象类型属性

  • 创建对象
public class Dao{
    public void add(){
        System.out.println("add...");
    }
}

public class UserService{
    private Dao dao;

    public void set(Dao dao){
        this.dao=dao;
    }
}
  • 配置文件
<bean id="userDao" class="cn.itcast.ioc.Dao"></bean>
<bean id="userService" class="cn.itcacst.ioc.UserService">
    <property name="dao" ref="userDao"></property>
</bean>
  • 代码中创建对象
public class Service{
    public void testDao(){
        // 1.加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");

        // 2.得到配置创建的对象
        User user = (User)context.getBean("userService");
        ...
    }

五、P名称空间注入

这个方式在配置文件上有以下不同

xmlns:p = "http://www.springframework.org/schema/p"
<bean id="person" class="cn.itcast.property.Person" p:name="lucy"></bean>

六、注入复杂类型

这里说明三种类型注入的配置文件是如何配置的,分别是数组、list集合和map集合。类的创建和调用和上面的例子大致相同。

<bean id="person" class="cn.itcast.property.Person">
    <!--数组-->
    <property name="arrs">
        <list>
            <value>小王</value>
            <value>小马</value>
            <value>小赵</value>
        </list>
    </property>
    <!--list-->
    <property name="arrs">
        <list>
            <value>小奥</value>
            <value>小金</value>
            <value>小普</value>
        </list>
    </property>
    <!--map-->
    <property name="map">
        <map>
            <entry key="aa" value="lucy"></entry>
            <entry key="bb" value="mary"></entry>
            <entry key="cc" value="tom"></entry>
        </map>
    </property>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值