SpringIOC核心容器bean

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_29150765/article/details/85157075

Spring IOC是为了将类解耦

//创建一个类
public class HelloWorld {
    private String name;

    public void setName(String name) {
        System.out.println("设置属性方法");
        this.name = name;
    }

    public HelloWorld() {
        System.out.println("初始化构造器");
    }

    public void hello() {
        System.out.println("hello " + name);
    }
}

Spring的核心容器bean

通过XML文件配置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配置文件
  bean标签:用于spring读取配置文件后创建对象-->
    <!--属性:id:对象的唯一标识;class:要创建对象的全限定类名-->
    <bean id="helloWorld" class="spring.HelloWorld">
        <!-- 设置值-->
        <property name="name" value="spring"></property>
    </bean>
</beans>

创建spring IOC 容器的两种方式

  • ApplicationContext:它是BeanFactory的子对象下的子对象;创建对象时,采用立即加载策略。(当读取完xml配置文件,配置文件中所有的对象都已经创建完成了);适合对象只使用一次,单例模式的场景。
public class ReadBean {
    public static void main(String[] args) {
        //通过读取类路径下的配置文件,创建spring的IOC容器。要求配置文件必须在类路径下
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
        //通过读取文件系统中的配置文件,创建spring容器。要求配置文件在文件系统中即可
        //FileSystemXmlApplicationContext:
        //从容器中获取bean实例
        HelloWorld helloWorld = (HelloWorld) ac.getBean("helloWorld");
        //调用方法
        helloWorld.hello();
    }
}

输出

  • BeanFactory:它是Spring IOC容器的顶层接口;创建对象时,采用延迟加载策略(当真正要从容器中获取对象时才会创建),适合使用多次对象的场景。

bean对象的三种创建方式

bean对象,即通过spring创建的类对象

  • 通过构造函数创建
    默认情况下,在spring配置文件中写了一个bean标签,并提供了class属性,spring就会调用该类的默认构造函数创建对象。如果没有默认构造函数,则对象创建失败。(无构造函数,默认不带参数;如果写了带参数的将没有默认不带参数的构造函数)
    <bean id="helloWorld" class="spring.HelloWorld">
//不写构造函数,默认无参数
public HelloWorld(String s) {
        System.out.println("初始化构造器");
    }
//No default constructor found
  • 通过静态工厂创建
    工厂类中提供静态方法,返回要使用的bean对象
    <!--静态工厂创建
        factory-method指定创建bean对象的方法-->
    <bean id="staticFactoryHello" class="spring.Factory" factory-method="getBean"></bean>
//静态工厂
public class Factory {
    public static IHelloWorld getBean(){
        return  new HelloWorld();
    }
}
//执行
HelloWorld staticFactoryHello = (HelloWorld) ac.getBean("staticFactoryHello");
staticFactoryHello.hello();

输出

  • 通过实例工厂创建
    工厂类中提供普通方法,返回要使用的bean对象
    <!--实例工厂创建
        factoty-bean 指定创建bean对象的工厂bean的ID-->
    <bean id="instanceFactory" class="spring.InstanceFactory"></bean>
    <bean id="instanceFactoryHello" factory-bean="instanceFactory" factory-method="getInstanceBean"></bean>
//实例工厂
public class InstanceFactory {
    public IHelloWorld getInstanceBean(){
        return new HelloWorld();
    }
} 
//调试
 HelloWorld instanceFactoryHello = (HelloWorld) ac.getBean("instanceFactoryHello");
instanceFactoryHello.hello();

输出

bean对象的作用范围

通过scope属性设置

<bean id="helloWorld" class="spring.HelloWorld" scope="singleton"></bean>
  • singleton:单例的,默认值;在读取配置文件时创建;多次获取仍然是同一个对象。
  • prototype:多例的;在每次获取时创建新对象;每次获取都不同。
  • request:web项目,一次请求中使用
  • session:web项目,一次会话范围
  • global-sesssion:web项目,应用在portlet环境,否则相当于session

bean对象的生命周期

在bean对象创建和销毁时,会执行HelloWorld类中的init()destory()

<bean id="helloWorld" class="spring.HelloWorld" 
          init-method="init" destroy-method="destory"></bean>
  • 单例对象
    出生:容器创建时
    活着:只要容器存在,对象就存在
    死亡:容器销毁,对象消亡

  • 多例对象
    出生:每次从容器中获取对象时,容器创建
    活着:只要对象在使用过程中,就一直存在
    死亡:当对象长时间不使用,并且没有其他对象引用,由java的垃圾回收器回收

猜你喜欢

转载自blog.csdn.net/qq_29150765/article/details/85157075