•什么是Spring Bean?
Spring IoC容器可以创建和配置应用组件对象,这里的组件对象称为Bean
•Spring可以看作一个大型工厂,生产和管理Spring容器中的Bean。
•使用这个工厂生产和管理Bean,需要将Bean配置在Spring的配置文件中。Spring框架支持XML和Properties两种格式的配置文件。
| 属性或子元素名称 | 描述 |
|---|---|
| id | Bean在BeanFactory中的唯一标识,在代码中通过BeanFactory获取Bean实例时需要以此作为索引名 |
| class | Bean的具体实现类 |
| scope | 指定Bean实例的作用域 |
index属性指定参数的序号, ref属性指定对BeanFactory中其它Bean的引用关系, type属性指定参数类型, value属性指定参数的常量值 |
|
name属性指定Bean实例中相应的属性名称, value属性指定Bean的属性值, ref属性指定对BeanFactory中其它Bean的引用关系 |
|
•Spring框架实例化Bean有三种方式:
–构造方法实例化
在Spring框架中,Spring容器可以调用Bean对应类中无参数构造方法来实例化Bean,这种方式称为构造方法实例化
必须有setser器
–静态工厂实例化
• 使用静态工厂实例化Bean时,要求开发者在工厂类中创建一个静态方法来创建Bean的实例。
• 配置Bean时,class属性指定静态工厂类,同时还需要使用factory-method属性指定工厂类中的静态方法
–实例工厂实例化
• 使用实例工厂实例化Bean时,要求开发者在工厂类中创建一个实例方法来创建Bean的实例。
• 配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要factory-method属性指定实例工厂中的实例方法。
- 三种实例化方法的区别:
Bean的作用域
| 作用域名称 | 描述 |
|---|---|
| singleton | 默认的作用域,使用singleton定义的Bean在Spring容器中只有一个Bean实例。 |
| prototype | Spring容器每次获取prototype定义的Bean,容器都将创建一个新的Bean实例。 |
| request | 在一次HTTP请求中容器将返回一个Bean实例,不同的HTTP请求返回不同的Bean实例。仅在Web Spring应用程序上下文中使用。 |
| session | 在一个HTTP Session中,容器将返回同一个Bean实例。仅在Web Spring应用程序上下文中使用。 |
| application | 为每个ServletContext对象创建一个实例,即同一个应用共享一个Bean实例。仅在Web Spring应用程序上下文中使用。 |
| websocket | 为每个WebSocket对象创建一个Bean实例。仅在Web Spring应用程序上下文中使用。 |
基于注解的装配
•如果应用中有大量的Bean需要装配,会导致XML配置文件过于庞大。
•更多的时候推荐使用注解(annotation)的方式装配Bean。
•@Component是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。
•现在有了Bean的实现类,但还不能进行测试,因为Spring容器并不知道去哪里扫描Bean对象。需要在配置文件中配置注解,注解配置方式如下:
2.@Repository
用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层Bean,其功能与@Component()相同。
3.@Service
用于标注一个业务逻辑组件类(Service层),其功能与@Component()相同。
4.@Controller
用于标注一个控制器组件类(Spring MVC的Controller),其功能与@Component()相同。
5.@Autowired
可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。 通过@Autowired的使用来消除setter 和getter方法。默认按照Bean的类型进行装配。
6.@Resource
与@Autowired功能一样。区别在于,该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要结合@Qualifier注解一起使用。
@Resource注解有两个属性:name和type。name属性指定Bean实例名称,即按照名称来装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。
7.@Qualifier
与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入,则需要结合该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定。
•虽然@Repository、@Service和 @Controller等注解的功能与@Component相同,但为了使标注类的用途更加清晰(层次化),在实际开发中推荐
–使用@Repository标注数据访问层(DAO层)、
–使用@Service标注业务逻辑层(Service层)、
–使用@Controller标注控制器层(控制层)。
