SpringIOC如何注册管理bean?


前言

上次的文章中写了如何构建自己的知识体系,今天我们就根据上次的知识体系来梳理相关的技术框架。这次我要梳理的就是Spring框架。


一、Spring框架的核心?

Spring是一个开源的、全面的企业级应用开发框架,它提供了一套完整的解决方案,用于简化企业级应用程序的开发。

Spring框架包含的东西很多,今天我主要梳理的就是Spring框架的核心内容:SpringIOC。这也是我们开发中使用最多的技术,在官方文档中介绍说也是将这两个技术是Spring 框架中绝对不可或缺的所有技术。原文如下:

二、Spring IOC

我认为IOC(Inversion of Control )即控制反转,是一种概念性的描述。依赖注入(DI)是IOC在Spring中的实现方法。

说到IOC我会想到他是Spring管理bean的容器,负责bean的注册和bean的注入。

1.bean注册方式

1.基于配置文件方式

这是Spring早期版本中最常用的Bean注册方式。开发者可以在XML配置文件中声明Bean的实例,并配置它们的属性和其他依赖关系。

<bean id="exampleBean" class="com.example.ExampleBean">
    <property name="message" value="Hello, World!" />
</bean>

2.基于注解的方式

Spring 2.5版本开始支持注解配置,这使得可以在类级别或方法级别直接使用注解来声明Bean。@使用@Component注解标记一个类,使其成为一个Bean。@Repository、@Service、@Controller这些注解是@Component的特殊类型,分别用于数据访问层、业务逻辑层和服务层。

@Component
public class ExampleBean {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

@Service
public class UserService {
    // ...
}

@Repository
public class UserRepository {
    // ...
}

@Controller
public class UserController {
    // ...
}

3.Java配置类

Spring 3.0引入一种纯Java配置方式,使用Java类替代XML配置文件来定义Bean。使用@Configuration和@Bean组合起来定义Bean。

@Configuration
public class AppConfig {
    @Bean
    public ExampleBean exampleBean() {
        ExampleBean bean = new ExampleBean();
        bean.setMessage("Hello, World!");
        return bean;
    }
}

2.bean依赖关系注入

这一步主要是让IOC容器中能够记录bean之间的依赖关系,方便后面根据这些依赖关系进行将依赖的bean注入到创建的bean中。主要的方式也是下面几种:

1.XML配置

在早期版本的Spring中,依赖关系通常通过XML配置文件来管理。

<bean id="userService" class="com.example.UserService">
    <constructor-arg ref="userRepository" />
</bean>

<bean id="userRepository" class="com.example.UserRepository" />

 2.注解

Spring框架提供了多种注解来帮助管理依赖关系,这些注解可以简化依赖注入的过程。

@Autowired 通过类型寻找依赖的bean注入,可以放在字段、构造函数或setter方法上。如果有重复类型的bean需要结合@Qualifier标记特定的bean注入。

public class UserService {
    private UserRepository userRepository;

    @Autowired
    @Qualifier("customUserRepository")
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

 @Resource 类似于@Autowired,但默认按名称查找Bean。可以放在字段、构造函数或setter方法上。

public class UserService {
    @Resource(name = "customUserRepository")
    private UserRepository userRepository;
}

3.基于配置类

 使用@Configuration和@Bean注解来定义Bean及其依赖关系。

@Configuration
public class AppConfig {
    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }

    @Bean
    public UserService userService(UserRepository userRepository) {
        return new UserService(userRepository);
    }
}

3.bean的注入

在创建Bean实例的过程中,对于需要注入依赖关系的属性,Spring容器会解析BeanDefinition中的依赖关系,并通过反射机制获取依赖对象的实例,将其注入到目标Bean的属性中。依赖注入主要有以下几种方式:

1.构造函数注入

通过Bean的构造函数来注入依赖关系。

2.Setter方法注入

通过Bean的Setter方法来注入依赖关系,这种方式适合在对象创建后才设置依赖关系的场景。

3.字段注入

直接在类的字段上通过注解来注入依赖关系,虽然简单直接,但通常不推荐使用,因为它破坏了类的封装性。

4.bean的生命周期

Spring bean的生命周期是由IOC容器管理的从生到死的过程。从上面我们已经能够了解到SpringIOC创建一个bean的基本过程应该包括一下几点:

  1. 获取bean定义:从配置文件,@Component@Repository、@Service、@Controller注解的类,@Configuration和@Bean注解的配置类中获取bean的定义信息包含class类型、是否是抽象类、构造方法参数、属性、依赖关系等封装到BeanDefinition对象中。
  2. bean信息注册:封装好的BeanDefinition对象会被注册到BeanDefintionRegistry中。这个注册信息会和BeanFactory存储到一起,后面BeanFactory可以根据BeanDefintionRegistry中的BeanDefinition信息利用Java反射创建普通对象。
  3. bean实例创建:Spring容器(beanFactory)根据BeanDefinition中的信息选择合适的构造函数(默认选择无参构造函数。如果没有无参构造函数,其它构造函数参数类型,个数不同,不能确定构造函数会报错。如果多个构造函数具有相同数量和类型的参数,那么Spring会选择其中一个。如果参数类型相同但具体实例不同,Spring会尝试使用依赖注入来匹配这些参数。),使用反射机制创建Bean的实例。该实例对象目前只是一个普通对象。
  4. bean对象属性设置:这里就会使用到上面讲的bean的三种注入方式构造函数注入、setter方法注入、字段注入。
  5. 初始化方法调用:如果Bean定义中有初始化方法(如init-method属性或@PostConstruct注解),Spring会调用这个方法执行初始化。
  6. AOP代理:检查bean是否需要被代理,如果需要创建代理对象。如果被代理将代理对象放入beanfactory中。
  7. bean的使用:此时Bean已经准备就绪,可以被其他Bean或应用程序使用。在应用程序运行期间,Spring容器会管理这些Bean,并确保它们始终处于正确的状态。
  8. Bean的销毁:当Spring容器关闭时,它会销毁它管理的所有Bean。如果Bean定义中有销毁方法(如destroy-method属性或@PreDestroy注解),Spring会调用这个方法。

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值