Spring(三)--Bean

1、bean作用域

1、singleton(单例模式:默认):确保spring容器中只会存在一个共享的bean实例,并且对所有的bean请求只要id与该bean定义的相匹配,就会返回一个这个bean的实例。

2、prototype(原型模式):每次通过spring容器获取prototype定义的bean时,容器都会创建一个新的bean实例,作用域等同于Java里的new操作符,并且不会保存原有的实例。单例模式不同,多次调用bean实例实际上是同一个单例模式对象,并且保存了该对象的状态信息。

3、request(每次HTTP请求、都会返回一个Bean实例):也就是每次访问一次这个网址都会返回一个这个bean实例。对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Request 内有效。

4、 session(每次会话系统建立一个session、就会返回一个Bean实例):放到session中的最普遍的信息就是用户登录信息,Spring容器会为每个独立的session创建属于它们自己全新的UserPreferences对象实例。与request相比,除了拥有session scope的bean比request scope的bean可能更长的存活时间,其他没什么差别

5、 global Session(全局的Session):在一个全局的 HTTP Session 中,容器会返回该 Bean 的同一个实例,该作用域仅在使用 portlet context 时有效

6、singleton 和 prototype 区别
第一 singleton 单实例,prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象

7、如何设置单实例还是多实例
(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象
<bean id="Orders" class="com.ljc.pojo.Orders" scope="prototype"></bean>

2、bean生命周期

2.1生命周期

从对象创建到对象销毁的过程

2.2bean生命周期(过程)

1、通过构造器创建bean实例(无参构造)
2、为bean的属性设置值和对其他bean引用(调用set方法)
3、调用bean的初始化方法(需要进行配置)
4、bean可以使用了(获取到对象)
5、当容器关闭时,调用bean的销毁方法(需要进行配置销毁方法)

2.3生命周期过程

public class Orders {
public class Orders {
    private String oname;
    public Orders(){
        System.out.println("第一步 执行无参构造创建bean实例");
    }

    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步 调用set方法设置属性值");
    }

    //创建执行的初始化方法
    public void initMethod(){
        System.out.println("第三步 执行初始化的方法");
    }

    //创建执行的销毁方法
    public void destroyMethod(){
        System.out.println("第五步 执行销毁的方法");
    }
}
<bean id="orders" class="com.ljc.pojo.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="笔记本"></property>
    </bean>
public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring3.xml");
        Orders orders = context.getBean("orders", Orders.class);
        System.out.println("第四步 获取bean实例对象");
        System.out.println(orders);
        //手动让bean实例销毁
        ((ClassPathXmlApplicationContext)context).close();
    }

2.4bean的后置处理器(对当前配置文件中的所有bean都有效),加上后生命周期有七步

1、通过构造器创建bean实例(无参构造)
2、为bean的属性设置值和对其他bean引用(调用set方法)
插入步骤:把bean实例传递给bean后置处理器的方法(postProcessBeforeInitialization)
3、调用bean的初始化方法(需要进行配置)
插入步骤:把bean实例传递给bean后置处理器的方法(postProcessAfterInitialization)
4、bean可以使用了(获取到对象)
5、当容器关闭时,调用bean的销毁方法(需要进行配置销毁方法)

6、演示:
(1)创建类,实现接口BeanPostProcessor,创建后置处理器

public class MyBeanPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之前执行的方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之后执行的方法");
        return bean;
    }
}
<bean id="myBeanPost" class="com.ljc.pojo.MyBeanPost"></bean>
posted @ 2022-07-19 17:54  JacketLi  阅读(50)  评论(0编辑  收藏  举报