一、概述
- 什么是Bean
在Spring框架中,Bean是指被Spring容器所管理的Java对象。该对象可以是任何简单的Java对象(POJO),也可以是Web应用程序中的任何组件,例如servlet或过滤器。
- Bean的生命周期
Bean的生命周期包括以下几个阶段:
- 实例化:Spring容器创建Bean的实例;
- 属性设置:Spring容器通过setter方法或构造方法为Bean设置属性值;
- 初始化:通过自定义初始化方法来初始化Bean,该方法由开发人员控制;
- 使用:Bean已被Spring容器创建并初始化,可在应用程序中使用;
- 销毁:调用开发人员自定义的销毁方法来销毁Bean。
- 为什么需要实例化Bean
在Java应用程序中,对象的创建和销毁是由程序员自己来处理的,这样会产生很多问题,例如对象管理、对象重用、对象依赖关系等问题。而Spring容器可以通过配置Bean来管理Java对象,从而解决这些问题。
二、XML配置方式
- 在XML中声明Bean
通过在Spring配置文件中使用
<bean id="userService" class="com.example.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
其中,id属性表示Bean的唯一标识符,class属性表示Bean的完全限定类名,
- Bean的属性注入
在配置Bean时,需要将相关属性注入到Bean中。Spring提供两种属性注入方式:构造方法注入和属性注入。
1) 构造方法注入
通过在
<bean id="userService" class="com.example.UserService">
<constructor-arg index="0" ref="userDao"></constructor-arg>
</bean>
其中,index属性表示注入参数的位置,ref属性表示引用另一个Bean。
2) 属性注入
属性注入和构造方法注入的区别在于,属性注入是通过setter方法或直接为属性设置值来实现的。例如:
<bean id="userService" class="com.example.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
其中,name属性表示属性名,ref属性表示引用另一个Bean。
- 依赖注入
依赖注入是将一个Bean引用另一个Bean的过程,Spring提供了两种依赖注入方式:构造方法注入和Setter方法注入。
1) 构造方法注入
通过在
<bean id="userService" class="com.example.UserService">
<constructor-arg index="0" ref="userDao"></constructor-arg>
</bean>
其中,index属性表示注入参数的位置,ref属性表示引用另一个Bean。
2) Setter方法注入
通过在
<bean id="userService" class="com.example.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
其中,name属性表示属性名,ref属性表示引用另一个Bean。
三、注解配置方式
- @Component注解
@Component是一个通用的Spring注解,用于指示一个类作为Spring Bean。例如:
@Component
public class UserDao {
...
}
- @Autowired注解
@Autowired是一个用于自动注入Bean的注解,可以用于构造方法注入和Setter方法注入。
1) 构造方法注入
通过在构造方法上使用@Autowired注解来进行构造方法注入。例如:
@Component
public class UserService{
private UserDao userDao;
@Autowired
public UserService(UserDao userDao){
this.userDao = userDao;
}
}
2) Setter方法注入
通过在setter方法上使用@Autowired注解来进行Setter方法注入。例如:
@Component
public class UserService{
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
}
- @Qualifier注解
@Qualifier是一个用于指定Bean名称的注解。在使用@Autowired注解进行自动注入时,如果存在多个类型相同的Bean,可以通过@Qualifier指定Bean的名称。例如:
@Component
public class Service{
private Dao dao;
@Autowired
public void setDao(@Qualifier("daoImpl") Dao dao){
this.dao = dao;
}
}
四、Java配置方式
- @Configuration注解
@Configuration是一个用于定义Spring配置类的注解。该注解表示这个类的实例是一个IoC容器,这个IoC容器用于生产Bean实例。例如:
@Configuration
public class AppConfig {
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
- @Bean注解
@Bean是一个用于定义Spring Bean的注解。这个注解标明了一个方法是Bean的生产方法,同时产生的Bean对象会被注册到Spring容器中。例如:
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(userDao());
}
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
-
依赖注入
1) 构造方法注入
通过在Bean的生产方法上进行构造方法注入。例如:
@Configuration
public class AppConfig {
@Bean
public UserService userService(UserDao userDao) {
return new UserService(userDao);
}
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
2) Setter方法注入
通过在Bean的生产方法中进行Setter方法注入。例如:
@Configuration
public class AppConfig {
@Bean
public UserService userService(){
UserService userService = new UserService();
userService.setUserDao(userDao());
return userService;
}
@Bean
public UserDao userDao(){
return new UserDaoImpl();
}
}
五、扩展点
-
Bean的作用域
Spring支持多种Bean的作用域:singleton(默认)、prototype、request、session和global session。
- singleton:一个容器中只存放一个Bean实例。
- prototype:每次注入或者getBean时都返回一个全新的Bean实例。
- request:每次HTTP请求都创建一个新的实例。
- session:同一Session共享一个Bean实例。
- global session:同一Portlet共享一个Bean实例。
通过@Scope注解来进行Bean的作用域配置。例如:
@Component
@Scope("prototype")
public class UserService{
...
}
-
Bean的初始化和销毁方法
可以在Bean中定义自己的初始化和销毁方法。在初始化方法和销毁方法被调用时,Spring会自动调用该方法。初始化方法通过@PostConstruct注解进行声明,销毁方法通过@PreDestroy注解进行声明。例如:
@Component
public class UserService{
@PostConstruct
public void init(){
//初始化方法
}
@PreDestroy
public void destroy(){
//销毁方法
}
}
-
Bean的延迟加载
Bean的延迟加载是指Spring容器在需要用到Bean时才进行加载。通过在Bean的@Scope注解中配置lazy-init属性为true来实现Bean的延迟加载。例如:
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS, lazyInit = true)
public class UserService{
...
}
六、总结
通过以上介绍,我们对于Java中Bean的配置方式以及扩展点有了更深入的了解。在实际项目开发中,不同的配置方式可以根据需要进行选择,并且可以根据具体需求来定制Bean的作用域、初始化和销毁方法等。
文章评论