什么是Spring beans

Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。

一个 Spring Bean 定义 包含什么?

一个Spring Bean 的定义包含容器必知的所有配置元数据,包括bean,它的生命周期详情及它的依赖。

如何创建一个如何给Spring 容器提供配置元数据?Spring有几种配置方式

这里有三种重要的方法给Spring 容器提供配置元数据。

XML配置文件。

基于注解的配置。

基于java的配置。

Spring配置文件包含了哪些信息

Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。

Spring基于xml注入bean的几种方式

1. Set方法注入;

2. 构造器注入:①通过index设置参数的位置;②通过type设置参数类型;

3. 静态工厂注入;

4. 实例工厂;

你怎样定义类的作用域?

当定义一个 在Spring里,我们还能给这个bean声明一个作用域。它可以通过 bean 定义中的scope属性

来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,beanscope属性被指定为

prototype。另一方面,一个bean 每次使用的时候必须返回同一个实例,这个beanscope 属性 必须

设为 singleton

解释Spring支持的几种bean的作用域

Spring框架支持以下五种bean的作用域:

singleton : bean在每个Spring ioc 容器中只有一个实例。

prototype:一个bean的定义可以有多个实例。request:每次http请求都会创建一个bean,该作用域仅在基于webSpringApplicationContext

情形下有效。

session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于webSpring

ApplicationContext情形下有效。

global-session:在一个全局的HTTP Session中,一个bean定义对应一个

实例。该作用域仅在基于webSpring ApplicationContext情形下有效。

注意: 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创

建和销毁 bean 会带来很大的性能开销。

Spring框架中的单例bean是线程安全的吗?

不是,Spring框架中的单例bean不是线程安全的。

spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。

实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但

如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就

是改变 bean 的作用域,

“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean() 了,所以就可以保证线程安全

了。

有状态就是有数据存储功能。

无状态就是不会保存数据。

Spring如何处理线程并发问题?

在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声

明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程

安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了时间换

空间的方式,仅提供一份变量,不同的线程在访问前

需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了空间换时间的方式。

ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为

每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程

安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。解释Spring框架中

bean的生命周期

在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean 实例化,然后该bean

可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。相比之下,Spring容器中的bean

生命周期就显得相对复杂多了。正确理解Spring bean的生命周期非常重要,因为你或许要利用Spring

供的扩展点来自定义bean的创建过程。下图展示了bean装载到Spring应用上下文中的一个典型的生命

周期过程。beanSpring容器中从创建到销毁经历了若干阶段,每一阶段都可以针对 Spring如何管理bean进行个

性化定制。

正如你所见,在bean准备就绪之前,bean工厂执行了若干启动步骤。

我们对上图进行详细描述:

Springbean进行实例化;

Spring将值和bean的引用注入到bean对应的属性中;

如果bean实现了BeanNameAware接口,SpringbeanID传递给setBeanName()方法;

如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()

法,将BeanFactory容器实例传入;

如果bean实现了ApplicationContextAware接口,Spring将调用 setApplicationContext()方法,将bean

所在的应用上下文的引用传入进来;

如果bean实现了BeanPostProcessor接口,Spring将调用它们的post

ProcessBeforeInitialization()方法;

如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果

bean使用initmethod声明了初始化方法,

该方法也会被调用;

如果bean实现了BeanPostProcessor接口,Spring将调用它们的post

ProcessAfterInitialization()方法;此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留

在应用上下文中,直到该应用上下文被销毁;

如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方

法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

现在你已经了解了如何创建和加载一个Spring容器。但是一个空的容器并没有太大的价值,在你把东西

放进去之前,它里面什么都没有。为了从Spring

DI(依赖注入)中受益,我们必须将应用对象装配进Spring容器中。哪些是重要的bean生命周期方法? 你能重载它们吗?

有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean

时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。

bean 标签有两个重要的属性(init-methoddestroy-method)。用它们你可以自己定制初始化和注销

方法。它们也有相应的注解(@PostConstruct@PreDestroy)。

什么是Spring的内部bean?什么是Spring inner beans

Spring框架中,当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean。内部bean

可以用setter注入属性和构造方法注入构造参数的方式来实现,内部bean通常是匿名的,它们的

Scope一般是prototype

 Spring中如何注入一个java集合?

Spring提供以下几种集合的配置元素:类型用于注入一列值,允许有相同的值。

类型用于注入一组值,不允许有相同的值。

类型用于注入一组键值对,键和值都只能为String类型。

什么是bean装配?

装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如

何通过依赖注入来把它们装配到一起。

什么是bean的自动装配?

Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,

Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通

Bean工厂自动处理bean之间的协作。这意味着 Spring可以通过向Bean

Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在

特定的bean上。

解释不同方式的自动装配,spring 自动装配 bean 有哪些方式?

spring中,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋

予各个对象,使用autowire来配置自动装载模式。

Spring框架xml配置中共有5种自动装配:

no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean

byName:通过bean的名称进行自动装配,如果一个bean property 与另一bean name

同,就进行自动装配。

byType:通过参数的数据类型进行自动装配。

constructor:利用构造函数进行装配,并且构造函数的参数通过 byType进行装配。

autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方

式自动装配。使用@Autowired注解自动装配的过程是怎样的?

使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进

行配置,。

在启动spring IoC时,容器自动装载了一个

AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied@Resource

@Inject时,就会在IoC容器自动查找需要的 bean,并装配给该对象的属性。在使用@Autowired时,首

先在容器中查询对应类型的bean 

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;

如果查询的结果不止一个,那么@Autowired会根据名称来查找;

如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false

自动装配有哪些局限性?

自动装配的局限性是:重写:你仍需用 和 配置来定义依赖,意味着总要重写自动装配。

基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。

模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。

你可以在Spring中注入一个null 和一个空字符串吗?

可以

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红红火火a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值