Spring学习-Bean的理解

简介: Spring学习-Bean的理解

Bean的理解

三:Spring是如何管理Bean的

一:什么是Spring的Bean

1:基本概念

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


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


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


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

Bean工厂和应用上下文是Spring框架中的两个重要概念,它们都是Spring容器的一种。

下面我会简要地介绍它们的区别和作用。


2.1 Bean工厂

Bean工厂是Spring框架中最基本的IoC容器,它负责实例化、配置和管理Bean对象。在Spring中,Bean工厂可以通过XML文件、Java代码或注解来配置和创建Bean对象。当我们需要使用某个Bean对象时,我们可以向Bean工厂发出请求,Bean工厂会返回对应的Bean实例。

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>

2.在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;
    }
}

3.隐式的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的整个生命周期:

目录
相关文章
|
12天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
11天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
37 9
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
67 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
35 9
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
20 1
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
59 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
92 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
26 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
24 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现