Spring中的Bean


Spring中的bean的作用域有哪些?
  • singleton:单例模式,默认是单例模式。
  • prototype:每次请求都会创建一个新的bean实例。
  • request:每次HTTP请求都会产生一个新的Bean,仅在当前request有效
  • session:每一次HTTP请求都会产生一个新的Bean,尽在当前session有效
  • global—session:全局session作用域,仅在portlet的web容器中有效。
Spring中的单例Bean的线程安全问题?

单例Bean存在线程安全问题,主要是当多线程操作同一个对象时,对这个对象的非静态成员变量的写操作会存在线程安全的问题。

解决办法:

  1. 在Bean对象中尽量避免定义可变的成员变量(不太现实)。
  2. 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在TheadLocal中。
@Component和@Bean的区别是什么?
  1. 作用对象不同:@Component注解作用于类,@Bean注解作用于方法
  2. @Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。
  3. @Bean注解比Component注解的自定义性更强,而且很多地方我们只能通过@Bean注解来注册Bean。
将一个类声明为Spring的Bean的注解有哪些?

我们一般使用@Autowired注解自动装配Bean,要想把类标识成可用于@Autowired注解自动装配的Bean的类,采用以下注解实现

  • @Component:通用注解,可标注任意类为Spring组件。如果一个Bean不知道属于那个层,可以使用@Component标注。
  • @Repository:对应持久层Dao层,主要用于数据库相关操作。
  • @Service:对应服务层
  • @Controller:对应控制层