spring中ioc创建对象的方法

spring中ioc创建对象的方法

介绍

最近在学习spring,学了又忘,忘了又学,还是需要做做总结,动动手知识才能变成自己的。

创建对象的方法

我们的需求是创建一个User的对象,其中User只有一个属性name

1.无参构造方法

User代码:

package com.zhouning.spring.beans;

public class User {

    private String name;

    public User() {
        System.out.println("调用了无参构造方法");
    }

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

    public void show(){
        System.out.println("你好:"+name);
    }
}

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.zhouning.spring.beans.User">
<!--        通过无参的方法创建对象-->
        <property name="name" value="张三"></property>
    </bean>
</beans>

调用:

public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        User user = (User) applicationContext.getBean("user");
        user.show();

 }

输出:

调用了无参构造方法
你好:张三

需要注意的点:

  • 调用无参的方法,则类里面需要有set方法才能对属性进行设置
  • 构造的属性设置<property name="name" value="张三"></property>中,name="name",这个引号中的name是对应的set方法去掉set后第一个字母小写(当然大写也可以),如:我这里面的set方法是setNmae,所以对应name="name";如果set方法是setNName,则对应的写法是name="NName"
  • 方法名尽量符合规范,这样在配置的时候也好写一些

2.有参的构造方法

User代码:

package com.zhouning.spring.beans;

public class User {

    private String name;

    public User(String name) {
        System.out.println("调用了有参构造方法");
        this.name = name;
    }

    public void show(){
        System.out.println("你好:"+name);
    }
}

  • 根据参数下标来设置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.zhouning.spring.beans.User">
    <!--    根据参数下标-->
       <constructor-arg index="0" value="李四"></constructor-arg>
    </bean>
</beans>
  • 根据参数类型
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.zhouning.spring.beans.User">
    <!--    根据参数类型-->
       <constructor-arg type="java.lang.String" value="李四"></constructor-arg>
    </bean>
</beans>
  • 根据参数名字
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.zhouning.spring.beans.User">
    <!--    根据参数名字-->
       <constructor-arg name="name" value="李四"></constructor-arg>
    </bean>
</beans>

这三种方法最后的输出都是:

调用了有参构造方法
你好:李四
  • 需要注意的是这三种方法可以合在一起使用,如<constructor-arg name="name" value="李四" type="java.lang.String"></constructor-arg>,这样可以应对有点时候类型不确定等情况。

3.通过工厂方法

  • 静态工厂

创建静态工厂类UserFactory:

/**
 * 静态工厂
 */
public class UserFactory {
    public static User newInstance(String name){
        return new User(name);
    }
}

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.zhouning.spring.factory.UserFactory" factory-method="newInstance">
<!--        通过工厂类创建对象-->
        <constructor-arg name="name" value="王五"></constructor-arg>
    </bean>
</beans>
  • 动态工厂

创建动态工厂类UserDynamicFactory:

public class UserDynamicFactory {
    public  User newInstance(String name){
        return new User(name);
    }
}

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userFactory" class="com.zhouning.spring.factory.UserDynamicFactory"></bean>
    <bean id="user" factory-bean="userFactory" factory-method="newInstance">
<!--        通过工厂类创建对象-->
        <constructor-arg name="name" value="王五"></constructor-arg>
    </bean>
</beans>

需要注意的地方:

  • 动态跟静态工厂的方法类似,区别在于动态工厂需要先创建工厂后再使用
  • 两者使用的都不多

总结

spring中ioc创建对象的方法总共是三类6种,总结一下。千里之行始于足下,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值