Spring Bean对象

Spring Bean对象的命名及初始化

对象的命名一般是在配置文件中通过id或name属性指定其名称。
对象的初始化一般指的是对象的构建,一般有三种方式

1)直接通过类的构造方法
(class="")
2)直接通过类的静态方法-静态工厂(factory-method="getInstance")
3直接通过类的实例方法-实例工厂
(factory-bean="" factory-method="")

Spring Bean对象的作用域

Spring中Bean对象的作用域一般是通过Scope属性配置,它的值最常用的有两个(不局限于这两个)

1)singleton单例:内存中此类的实例只有一份
2)prototyoe多例:每次从容器获取都会创建一个新的类的实例

       
       

说明:当spring中的对象是单例设计时,这个对象的内部实例变量操作必须是一个原子操作,否则可能会出现线程不安全的问题。

何为线程不安全?

多个线程并发访问同一共享数据集时出现的数据不一致这种现象,称之为线程不安全。例如多个线程卖共同的100张票出现了重复或者负数时,这就叫线程不安全。

出现线程不安全的场景:

1多个线程并发执行
2有共享数据集
3共享数据集上的操作并非是原子操作

Servlet的设计默认是单例的。

所以Servlet中可能会存在线程安全问题。
Servlet应用中什么场景可能会出现线程安全问题?
当servlet中定义了一个成员变量(实例变量或静态(类)变量),这个变量的操作又不是原子操作,此时就会出现线程不安全。

Spring Bean对象的生命周期

当Spring中bean元素的作用域为singleton时,此时对象的生命周期由spring管理,对象初始化调用通过init-method属性配置的方法,对象销毁时调用通过destroy-method属性配置的方法。假如作用域为prototype时,bean对象的创建可以由spring负责并调用通过init-method属性配置的方法,但对象的管理及销毁spring不再参与。
假如对象在初始化,销毁时需要执行动作可以在bean元素中,通过init-method和destroy-method属性指定要调用的具体方法。

       

Spring Bean对象的延迟加载

对象的延迟一般指的是何时需要何时加载,这是提高系统运行性能的一种手段。

       

说明:spring在启动时会默认初始化所有的bean对象,假如有一些bean对象可能长时间用不到缺创建了此对象,那么一些系统资源就好呗浪费,解决方案就是讲此对象的加载机制设置延迟加载。假如希望所有对象都采用延迟加载策略可以在配置文件的根元素beans中添加一个属性default-lazy-init="true"设置即可。

完整配置

package beans;

public class People {
    private int count;
    
    public People() {
        System.out.println("People.People()");
    }
    public void init(){
        System.out.println("init()");
    }
    public void eat(){
        System.out.println("eating");
    }
    public void destroy(){
        System.out.println("destroy()");
    }
    public synchronized void add(){
        count++;
        System.out.println(count);
    }
}

package beans;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ct=new ClassPathXmlApplicationContext("spring-configs.xml");
        People p = ct.getBean("people",People.class);
        p.eat();
        p.add();
        p.add();
        ct.close();
    }
}


  4.0.0
  com.spoon
  spring-ioc
  0.0.1-SNAPSHOT
  
    
        org.springframework
        spring-context
        4.3.10.RELEASE
    
  



       

运行结果

org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@54d81cda: startup date [Sun Nov 18 17:39:48 CST 2018]; root of context hierarchy
org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring-configs.xml]
People.People()
init()
eating
1
2
org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@54d81cda: startup date [Sun Nov 18 17:39:48 CST 2018]; root of context hierarchy
destroy()

你可能感兴趣的:(Spring Bean对象)