其他分享
首页 > 其他分享> > Spring(二)Spring Bean管理

Spring(二)Spring Bean管理

作者:互联网

Spring工厂类(续)

这里对上节 Spring工厂类中的BeanFactory和ApplicationContext进行补充

两者在生成bean实例的时机是不一样的,前者是在工厂实例化之后,在调用getBean的时候才会帮我们去创建这个类的实例,而后者是一加载配置文件,就会将配置文件中单例模式生成的类
全部实例化。

Spring Bean管理(XML方式)

首先我们要知道三种实例化Bean的方式

  1. 使用类构造器实例化(默认无参数)
  2. 使用静态工厂方法实例化(简单工厂模式)
  3. 使用实例工厂方法实例化(工厂方法模式)

接下来我们看看配置文件中一行代码

<bean id="bean1" class="com.imooc.ioc.demo2.Bean1"/>

bean的配置
id:一般情况下,装配一个Bean时,通过指定一 个id属性作为Bean的名称,id属性在IOC容器中必须是唯一的
name: 如果Bean的名称中含有特殊字符,就需要使用name属性
class: class用于设置一个类的完全路径名称,主要作用是IOC容器生成类的实例

Bean的作用域

在这里插入图片描述

对于这个作用域我们和Bean的实例化方式我们用一个案例来说明

同样的我们建立一个Maven项目,引入jar包,这些在上一节有讲我们不多说(在下边贴出引入jar包的代码),还是得有一个applicationContext.xml的配置文件,我们先进行无参构造器实例化Bean
com.MtLi下新建demo2包,再创建Bean1类和SpringDemo2
Bean1:

package com.MtLi.demo2;

/**
 * Bean的实例化的三种方式:采用无参数的构造方法的方式
 */
public class Bean1 {
    public Bean1(){//构造函数初始化
        System.out.println("Bean1被实例化了...");
    }
}

然后我们配置一下applicationContext.xml
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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">

    <!--UserService的创建权交给了Spring-->
    <!--<bean id="userService" class="com.MtLi.demo1.UserServiceImpl">-->
        <!--&lt;!&ndash;设置属性&ndash;&gt;-->
        <!--<property name="name" value="李四"/>-->
    <!--</bean>-->

    <!--Bean的实例化的三种方式-->
    <!--第一种:无参构造器的方式-->
    <bean id="bean1" class="com.MtLi.demo2.Bean1"/>

在这里面我们给定该bean的名称为bean1,以及对应的类路径,然后我们在SpringDemo2里面进行测试
SpringDemo2:

package com.MtLi.demo2;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试Bean的实例化的三种方式
 */
public class SpringDemo2 {
    @Test
    public void demo1(){
        //创建工厂
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类的实例:
        Bean1 bean1 = (Bean1)applicationContext.getBean("bean1");
    }
}

//运行结果
Bean1被实例化了...

看到这个结果,说明调用了构造方法

接下来,我们再来看看第二种方式——使用静态工厂方法实例化

我们同样的在com.MtLi.demo2下面新建Bean2,还要新建Bean2Factory类(我们需要对Bean2提供一个静态工厂,即提供一个静态方法)
Bean2:

package com.MtLi.demo2;

/**
 * Bean的实例化的三种方式:静态工厂实例化方式
 */
public class Bean2 {
}
//里面什么都不需要加

Bean2Factory:

package com.MtLi.demo2;

/**
 * Bean2的静态工厂
 */
public class Bean2Factory {
    public static Bean2 creatBean2(){
    //添加静态方法    
        System.out.println("Bean2Factory的方法已经执行...");
        return new Bean2();
    }
}

然后修改配置文件
applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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">

    <!--UserService的创建权交给了Spring-->
    <!--<bean id="userService" class="com.MtLi.demo1.UserServiceImpl">-->
        <!--&lt;!&ndash;设置属性&ndash;&gt;-->
        <!--<property name="name" value="李四"/>-->
    <!--</bean>-->

    <!--Bean的实例化的三种方式-->
    <!--第一种:无参构造器的方式-->
    <!--<bean id="bean1" class="com.MtLi.demo2.Bean1"/>-->
    <!--第二种:静态工厂的方式-->
    <bean id="bean2" class="com.MtLi.demo2.Bean2Factory" factory-method="creatBean2"/>

这里路径是对应的实例类(Bean2的静态工厂),我们需要指定它的静态方法,这里用到"factory-method"标签,然后我们进行测试
SpringDemo2:

package com.MtLi.demo2;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试Bean的实例化的三种方式
 */
public class SpringDemo2 {
//    @Test
//    public void demo1(){
//        //创建工厂
//        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//        //通过工厂获得类的实例:
//        Bean1 bean1 = (Bean1)applicationContext.getBean("bean1");
//    }

    @Test
    public void demo2(){
        //创建工厂
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类的实例:
        Bean2 bean2 = (Bean2)applicationContext.getBean("bean2");
    }
}


//运行结果
Bean2Factory的方法已经执行...

接下来是使用实例工厂方法实例化

我们新建Bean3类和Bean3Factory
Bean3:

package com.MtLi.demo2;

/**
 * Bean的实例化三种方式:实例工厂实例化
 */
public class Bean3 {
}
//里面什么都不需要加

Bean3Factory:

package com.MtLi.demo2;

/**
 * Bean3的实例工厂
 */
public class Bean3Factory {
    public Bean3 createBean3(){
    //和静态工厂主要的区别就是方法不是静态的
        System.out.println("Bean3Factory的方法已经执行...");
        return new Bean3();
    }
}

然后修改配置文件
applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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">

    <!--UserService的创建权交给了Spring-->
    <!--<bean id="userService" class="com.MtLi.demo1.UserServiceImpl">-->
        <!--&lt;!&ndash;设置属性&ndash;&gt;-->
        <!--<property name="name" value="李四"/>-->
    <!--</bean>-->

    <!--Bean的实例化的三种方式-->
    <!--第一种:无参构造器的方式-->
    <!--<bean id="bean1" class="com.MtLi.demo2.Bean1"/>-->
    <!--第二种:静态工厂的方式-->
    <!--<bean id="bean2" class="com.MtLi.demo2.Bean2Factory" factory-method="creatBean2"/>-->
    <!--第三种:实例工厂的方式-->
    <!--非静态需要先写工厂的实例-->
    <bean id="bean3Factory" class="com.MtLi.demo2.Bean3Factory"/>
    <bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/>

非静态和静态的配置不相同,静态可以直接指定方法,指定工厂类路径,但是非静态需要先有工厂的实例,然后再配置方法,需要指定工厂bean为工厂实例的bean名称(指明该方法的属向)
然后我们进行测试
SpringDemo2:

package com.MtLi.demo2;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试Bean的实例化的三种方式
 */
public class SpringDemo2 {
//    @Test
//    public void demo1(){
//        //创建工厂
//        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//        //通过工厂获得类的实例:
//        Bean1 bean1 = (Bean1)applicationContext.getBean("bean1");
//    }

//    @Test
//    public void demo2(){
//        //创建工厂
//        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//        //通过工厂获得类的实例:
//        Bean2 bean2 = (Bean2)applicationContext.getBean("bean2");
//    }

    @Test
    public void demo3(){
        //创建工厂
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类的实例:
        Bean3 bean3 = (Bean3)applicationContext.getBean("bean3");
    }
}


//运行结果
Bean3Factory的方法已经执行...

关于Bean的作用域测试(手打中)

标签:applicationContext,管理,Spring,工厂,Bean,实例,Bean2,public
来源: https://blog.csdn.net/weixin_42173451/article/details/99410112