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