Spring中Bean的常见配置(Scope作用范围、生命周期方法配置、Bean的生成)

Bean的常见配置

Scope作用范围

是可以通过 bean 标签的 scope 属性来进行指定的。其取值可以是:

  • singleton : 单例【默认值】。表示此对象在Spring容器中仅会存在唯一的一个实例。
  • prototype : 每实例。表示从容器中取出对象时,总会创建一个新的对象出来。
  • request (web环境下): 同一个请求中,拿到的bean是同一个。 【实际开发中放入请求域】
  • session(web环境下): 同一个会话中,拿到的bean是同一个。【实际开发中放入session域】
  • globalSession(portlet环境下):

其它特点:

  • 当bean的范围是 singleton 时, 此bean的对象是在Spring容器启动时创建出来。
  • 当bean的范围是 prototype时 ,是从容器中获取时才会创建bean的实例。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9nsn9Vn-1600046624880)(imges/image-20200825114753427.png)]

生命周期方法的配置

  • 形式都是无参的方法。
  • 通过bean标签的 init-method 和 destroy-method 属性来分别指定方法名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ushxmzB6-1600046624882)(imges/image-20200825114818271.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6xsKrQ7P-1600046624883)(imges/image-20200825115123404.png)]

另外,也可以通过注解的形式来指定。【了解】

    @PostConstruct //java标准的注解
    public void pre(){
    
    
        System.out.println("我把pre方法作为我的初始化方法....");
    }

    @PreDestroy
    public void post(){
    
    
        System.out.println("我把post方法作为我的销毁方法.....");
    }
//  @PostConstruct  会先于 init-method 指定的方法执行
// @PreDestroy  会先于 destroy-method 指定的方法执行
    <context:annotation-config></context:annotation-config>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dMHclo9n-1600046624886)(imges/image-20200825161026041.png)]

bean的生成方式

记住,你能用代码,不论什么途径可以获取到的对象,都可以用Spring 管理起来。

无参的构造方法[90%]

Student s  = new Student();
<!--调用的就是类的 无参的构造方法 ,用反射技术创建的实例-->    
<bean name="myStudent" class="com.example.spring.Student"></bean>

静态工厂方法的方式

StaticFactoryBean f = StaticFactoryMethodDemo.getBean();
    <!--配置静态工厂方法创建的bean-->
    <bean name="myStudent2" class="com.example.spring.StaticFactoryMethodDemo"
    factory-method="getBean"></bean>

<!--
 注意: 
	真正容器中的bean的类型是   factory-method 对应方法返回值的类型。 
	而不是 由 class 属性指定的类型来决定。
-->

实例工厂方法的方式

InstanceFactoryBean i = new InstanceFactoryMethodDemo().getBean();
<!--
	原则:  实例工厂本身也需要作为bean 注册到Spring 容器中
-->
 <!--配置实例工厂方法创建的bean-->
<!--1. 实例工厂 本身也需要作为bean 注册到Spring 容器中-->
<bean id="instanceFactory" class="com.example.spring.InstanceFactoryMethodDemo"/>
<!--2. 定义bean的时候,指定哪个实例工厂的, 哪个工厂方法-->
<bean name="myStudent3" factory-bean="instanceFactory" factory-method="getBean"/>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvFTCQp8-1600046624889)(imges/image-20200825163758089.png)]

特殊的通过实现Spring的 FactoryBean接口定义的Bean[Spring高级]

/*
    此对象的特点:是需要实现Spring 框架提供的一个接口 FactoryBean 接口
 */
public class SpringFactoryBean implements FactoryBean<Student> {
    
    
    @Override
    public Student getObject() throws Exception {
    
    
        //表示如何创建该对象
        Student s  = new Student();
        return s;
    }

    @Override
    public Class<?> getObjectType() {
    
    
        //表示产生的对象类型
        return Student.class;
    }

    @Override
    public boolean isSingleton() {
    
    
        //表示此bean是否是单例的
        return true;
    }
}
<!--这里配置一个基于Spring的 FactoryBean-->
<bean name="myStudent4" class="com.example.spring.SpringFactoryBean"/>

<!--
	myStudent4 的类型是:  Student
-->

在这种场景下, SpringFactoryBean 本身也会作为bean注册到Spring容器中,只不过它的名字叫 & + name属性值。

BeanFactory 和 FactoryBean的区别?

BeanFactory 是 创建 Bean实例的工厂,由 ApplicationContext 接口来继承。

也就是说: 一个 ApplicatitonContext 可以作为 BeanFactory。 BeanFactory beanFactory = context; //多态

但是, ConfigurableApplicationContext 接口中定义的 getBeanFactory() 返回的对象并不是Spring容器本身,而是容器用来创建 Bean实例时底层所使用的BeanFactory。

BeanFactory 本身的职责比较直接,仅负责bean的创建。 而 ApplicatitonContext 层面就功能更强大了, 由包括Spring的AOP、事务、事件、国际化、… 其它的好处。

0825

猜你喜欢

转载自blog.csdn.net/weixin_47371330/article/details/108572524