一:什么是Spring的Bean

1:基本概念

  1. 在Spring框架中,Bean是指在Spring容器中管理的一个对象。Spring容器通过对Bean的管理,实现了依赖注入、面向切面编程、声明式事务管理等核心特性。Spring的Bean可以是普通Java对象、JavaBean、POJO(Plain Old Java Object)等类型的对象,还可以是数据源、连接池、JMS(Java消息服务)等非常复杂的对象。

  2. 在Spring中,Bean是通过IoC(Inversion of Control,控制反转)容器创建、装配和管理的。IoC容器负责从Bean工厂中读取Bean的配置信息,并根据配置信息创建、初始化和管理Bean的生命周期。Spring的Bean工厂提供了很多Bean配置选项,可以控制Bean的实例化方式、作用域、依赖注入方式等。同时,Spring还提供了各种便捷的注解和API,使得Bean的配置和管理更加方便和灵活。

  3. 总之,Spring的Bean是Spring框架中的一个核心概念,它是构建Spring应用程序的基础组件之一。通过Spring的Bean容器,我们可以轻松创建、管理和组装各种对象,实现代码的解耦和复用。

2:Bean的工厂和应用上下文

Bean工厂和应用上下文是Spring框架中的两个重要概念,它们都是Spring容器的一种。
下面我会简要地介绍它们的区别和作用。

2.1 Bean工厂

  1. Bean工厂是Spring框架中最基本的IoC容器,它负责实例化、配置和管理Bean对象。在Spring中,Bean工厂可以通过XML文件、Java代码或注解来配置和创建Bean对象。当我们需要使用某个Bean对象时,我们可以向Bean工厂发出请求,Bean工厂会返回对应的Bean实例。
  2. Bean工厂提供了多种Bean的作用域,包括Singleton(单例模式)、Prototype(原型模式)、Request(请求模式)、Session(会话模式)等。不同作用域的Bean在不同的环境中有不同的生命周期,我们可以根据具体的需求来选择合适的作用域。

2.2 Bean的上下文。

在这里插入图片描述

  1. 应用上下文是基于Bean工厂的进一步抽象和扩展,它是一个更加高级的IoC容器。与Bean工厂相比,应用上下文提供了更多的功能,例如Bean的自动装配、国际化、事件传递等。同时,应用上下文也是Bean工厂的子接口,因此应用上下文可以完成Bean工厂的所有功能。
  2. Spring框架提供了多种类型的应用上下文,包括ClassPathXmlApplicationContext(基于类路径的上下文)、FileSystemXmlApplicationContext(基于文件系统的上下文)、AnnotationConfigApplicationContext(基于注解的上下文)等。我们可以根据具体的需求选择合适的应用上下文。

2.3 二者选择

Bean工厂和应用上下文都是Spring容器的一种,它们都可以管理Bean对象,并提供了不同的功能和特性。如果我们只需要最基本的IoC功能,可以使用Bean工厂;如果需要更多的功能和扩展,可以选择应用上下文。

二:如何使用Spring Bean

1:装配机制

在Spring中,有三种常见的方式来配置和管理bean,分别是:

  1. 在XML中显式配置:通过在XML文件中定义bean的信息,包括bean的id、class、属性值等,由Spring容器进行解析和管理。
    定义一个UserService的接口和其对应的实现类UserServiceImpl:
public interface UserService {
    void addUser(User user);
}

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    
    @Override
    public void addUser(User user) {
        userDao.addUser(user);
    }
}

public interface UserDao {
    void addUser(User user);
}

public class UserDaoImpl implements UserDao {
    @Override
    public void addUser(User user) {
        // 添加用户到数据库
    }
}

在XML文件中进行bean的配置:

<bean id="userDao" class="com.example.dao.UserDaoImpl" />
<bean id="userService" class="com.example.service.UserServiceImpl">
    <property name="userDao" ref="userDao" />
</bean>

  1. 在Java中进行显示配置:通过JavaConfig的方式,使用Java代码来定义bean的信息,可以避免使用XML文件,并且具有更好的类型安全性和编程体验。
    定义一个JavaConfig类,并在其中定义bean的信息:
@Configuration
public class AppConfig {
    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }
    
    @Bean
    public UserService userService() {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(userDao());
        return userService;
    }
}
  1. 隐式的bean发现机制和自动装配:Spring容器会自动发现和管理应用中的bean,通过自动装配的方式将它们连接起来。这种方式可以让开发者专注于业务逻辑的实现,而不用过多关注bean的管理。
//在使用注解时,可以使用@Component、@Service、@Repository和@Controller等注解标注bean类,Spring容器会自动扫描并注册这些bean。使用@Autowired注解自动注入依赖:
@Component
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    
    @Override
    public void addUser(User user) {
        userDao.addUser(user);
    }
}

2:自动化装配

  1. 组件扫描(component scanning) : Spring 会自动发现应用上下文中所创建的Bean
    Spring容器会自动扫描应用上下文中的类,发现带有特定注解的类,并将它们自动注册为Bean。这种方式可以避免手动在XML或JavaConfig文件中配置Bean信息,从而简化了开发过程。比如,使用@Component注解标记一个类,表示该类是一个组件(component),Spring会自动将其实例化并加入应用上下文中。
  2. 自动装配(autowiring): Spring自动满足bean中的依赖。
    在应用上下文中,有时一个Bean需要依赖另一个Bean才能正常工作。手动在XML或JavaConfig文件中配置依赖关系可能会很繁琐,而自动装配可以让Spring容器自动解析Bean之间的依赖关系,并自动将依赖的Bean注入到需要它们的Bean中。Spring提供了多种自动装配的方式,如byName、byType、constructor等,可以根据具体的情况选择适合的方式。

三:Spring是如何管理Bean的

Spring通过Bean容器来管理Bean,Bean容器是Spring框架中最基本的组件之一。

  1. BeanFactory是Spring框架中最基本的Bean容器,提供了最基本的Bean容器的功能,如Bean的创建、销毁、获取等操作。BeanFactory的实现类包括DefaultListableBeanFactory和XmlBeanFactory等,它们可以通过XML配置文件或者代码配置来初始化Bean。

  2. ApplicationContext是BeanFactory的子接口,提供了更多的功能和特性,如国际化、事件传递、Web应用支持等。ApplicationContext可以从类路径、文件系统、Web应用程序或者其他一些来源中加载配置信息,并创建相应的Bean。Spring提供了多个ApplicationContext的实现类,如ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigApplicationContext等。

  3. Spring管理Bean的过程中,可以通过XML配置文件或者Java代码配置来定义Bean的信息,如Bean的ID、类名、属性值等。Spring会将这些Bean的信息加载到Bean容器中,当需要使用Bean时,Spring会从容器中获取相应的Bean,并进行必要的依赖注入和初始化操作。在Bean的生命周期中,Spring还提供了一些回调方法,如Bean的初始化方法和销毁方法,可以在这些方法中进行一些额外的处理操作。
    下图给了一个Bean的整个生命周期:
    在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐