spring IoC容器创建对象_学习笔记

spring 容器创建对象的方式有:构造器方式、静态工厂、动态(实例)工厂;

一、构造器

1.无参构造器方式

<?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">

<!--配置我们的Dog类  spring 框架在底层 
  通过反射的机制  执行了我们的构造方法-->
<bean id="dog" class="cn.pb.dao.impl.Dog"></bean>
</beans>

直接这样配置一个bean的话,相当于是调用这个Dog类的无参构造器,如果无参构造器不在,Spring上下文创建对象的时候就会报错。

2.无参构造器加setter方法注入field的值

前提: 类中需要有无参构造器以及属性的set方法。
其实就是bean标签下再用property标签来设置name和value

<?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 class="com.mc.base.learn.spring.bean.Person" id="person">
        <property name="name" value="LiuChunfu"></property>
        <property name="id" value="125"></property>
    </bean>    
</beans>

如果有field是引用型的,就不用value,用ref = “xxx”,xxx就是某个bean的id或者name;

3.有参构造器

就是在bean标签下面,有个标签来确定这个bean的构造器的参数。

<?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 class="com.mc.base.learn.spring.bean.Person" id="person">
        <constructor-arg name="id" value="123"></constructor-arg>
        <constructor-arg name="name" value="LiuChunfu"></constructor-arg>
    </bean>
    
</beans>

也可以用参数下标的方式参考Ioc注入方式

二、静态工厂

package cn.pb.dao;

import cn.pb.dao.impl.Dog;

/**
 * AnimalFactory静态工厂类
 */
public class AnimalFactory {
    
    
    /**
     * 可以看到程序没有走构造方法
     */
    public AnimalFactory(){
    
    
        System.out.println("静态工厂的无参构造====");
    }
//静态工厂,不会走无参构造
    public static Animal getDog(){
    
    
        System.out.println("工厂中静态获取Dog实例的方法");
        return new Dog();
    }
}
<?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">

   

    <!--02.通过静态工厂 来创建我们对象的实例
     工厂的本身构造不会执行 因为我们的方法是静态的 !类只会被加载,不会被实例化!
     getDog必须是静态的-->
    <bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean>  

</beans>

三、动态(实例)工厂

package cn.pb.dao;

import cn.pb.dao.impl.Dog;

/**
 * AnimalFactory动态工厂类
 */
public class AnimalFactory {
    
    
    /**
     * 程序会先创建工厂实例 再调用getDog()方法
     */
    public AnimalFactory(){
    
    
        System.out.println("动态工厂的无参构造====");
    }
//动态工厂 会先走无参构造  创建实例
    public Animal getDog(){
    
    
        System.out.println("工厂中动态工厂获取Dog实例的方法");
        return new Dog();
    }
}
<?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">

   

    <!--03.动态工厂创建 对象的实例-->
    <bean id="factory" class="cn.pb.util.AnimalFactory"></bean><!-- 调用哪个工厂里的哪个方法  来创建对象  对象的id是dog-->
    <bean id="dog" factory-bean="factory" factory-method="getDog"/>

</beans>

创建Dog对象需要AnimalFactory 实例中的getDog()方法,所以先创建AnimalFactory ,在用AnimalFactory 实例(bean)中的getDog方法获得Dog实例对象

猜你喜欢

转载自blog.csdn.net/qq_40084325/article/details/110990109