Spring 提供了以下几种方式用于自动装配 Bean:
1. 默认的自动装配(Autowired):使用@Autowired
注解标记在字段、构造方法或者方法上,Spring 会根据类型进行自动装配。如果存在多个匹配的 Bean,可以使用@Qualifier
注解指定具体的 Bean。
2. 按名称自动装配(ByName):使用@Autowired
注解时,可以结合@Qualifier
注解指定 Bean 的名称,Spring 容器会根据名称进行自动装配。
3. 按类型自动装配(ByType):可以使用@Autowired
注解标记在字段、构造方法或者方法上,并且不使用@Qualifier
注解。Spring 容器会根据类型进行自动装配。
4. 按注解自动装配:使用@Autowired
注解时,结合自定义的注解,可以进行按照注解进行自动装配。例如,可以创建一个自定义注解@MyAnnotation
,并使用它来标记需要装配的 Bean,然后使用@Autowired
和@Qualifier
结合自定义注解进行自动装配。
5. 构造方法自动装配:在类的构造方法上使用@Autowired
注解,Spring 容器会根据构造方法参数的类型进行自动装配。
6. Setter 方法自动装配:在类的 Setter 方法上使用@Autowired
注解,Spring 容器会根据方法参数的类型进行自动装配。
需要注意的是,为了实现自动装配,需要在 Spring 配置文件中启用自动装配功能。可以使用<context:annotation-config>
或<context:component-scan>
元素来启用自动装配。
示例代码(XML 配置方式):
<context:annotation-config/>
<!-- 或 -->
<context:component-scanbase-package="com.example"/>
示例代码(注解配置方式):
@Configuration
@ComponentScan("com.example")
publicclass
AppConfig
{
// ...
}
下面是Spring 框架支持的几种 Bean 的作用域:
1. Singleton(单例):单例是默认的作用域,每个 Spring 容器中只有一个实例对象。无论有多少次请求同一个 Bean,都会返回同一个实例。
2. Prototype(原型):每次通过 Spring 容器获取该 Bean 时,都会创建一个新的实例对象。每个实例都具有独立的状态。
3. Request(请求):每个 HTTP 请求都会创建一个新的实例对象,该实例仅在当前 HTTP 请求的范围内有效。适用于 Web 应用程序。
4. Session(会话):每个用户会话都会创建一个新的实例对象,该实例仅在当前用户的会话范围内有效。适用于 Web 应用程序。
5. Global Session(全局会话):在基于 Portlet 的 Web 应用程序中,该作用域表示全局会话作用域。在其他环境中,它与标准的 Session 作用域没有区别。
6. Application(应用程序):在 Servlet 环境下(如 Spring Boot),该作用域表示应用程序级别的作用域,每个 ServletContext 中只有一个实例对象。
7. WebSocket:在 WebSocket 应用程序中,该作用域表示每个 WebSocket 连接的作用域,每个连接都会创建一个新的实例对象。
这些作用域可以通过在 Spring 配置文件中使用scope
属性或通过使用注解进行声明来指定。例如,在 XML 配置文件中,可以使用<bean>
标签的scope
属性,而在使用注解配置时,可以使用@Scope
注解。
示例代码(XML 配置方式):
<beanid="myBean"class="com.example.MyBean"scope="prototype"/>
示例代码(注解配置方式):
@Component
@Scope("prototype")
publicclass
MyBean
{
// ...
}