spring装配bean的七种方式

ops/2024/9/24 21:17:01/

在Spring框架中,Bean是应用程序的基本组成部分。Bean通常代表了应用程序中的一个对象实例,例如数据访问对象(DAO)、业务逻辑组件或控制器等。

1. XML配置文件

在Spring早期版本中,XML配置文件是最常用的配置方式。通过XML文件来定义Bean,可以让配置和代码分离,便于管理。

示例

<!-- applicationContext.xml -->
<bean id="myBean" class="com.example.MyBean"><property name="property" value="value"/>
</bean>

步骤

  1. 创建一个XML文件,例如applicationContext.xml
  2. 在文件中定义Bean,包括其类名和其他属性。
  3. 通过ApplicationContext加载该XML文件。

2. Java配置

随着Spring 3.0的引入,可以使用Java配置类来替代XML文件配置。这种方式更加灵活且易于维护。

示例

java">@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {MyBean bean = new MyBean();bean.setProperty("value");return bean;}
}

步骤

  1. 创建一个Java类,并使用@Configuration注解。
  2. 定义一个或多个带有@Bean注解的方法,每个方法定义一个Bean。
  3. 使用AnnotationConfigApplicationContext加载配置类。

3. 注解方式

使用注解可以简化配置,并且不需要额外的XML配置文件或者Java配置类。Spring提供了多种注解来定义Bean。

示例

java">@Service
public class MyBean {public void doSomething() {System.out.println("Doing something...");}
}@Component
public class AnotherBean {@Autowiredprivate MyBean myBean;public void doAnotherThing() {myBean.doSomething();}
}

步骤

  1. 在类上使用@Component@Service@Repository@Controller等注解。
  2. 使用@Autowired自动装配依赖。
  3. 通过ApplicationContext加载这些类。

4. 使用@ComponentScan

@ComponentScan注解可以自动扫描指定包下的所有被@Component@Repository@Service@Controller等注解标记的类,并将它们注册为Bean。

示例

java">@Configuration
@ComponentScan("com.example")
public class AppConfig {
}

步骤

  1. 创建一个带有@Configuration注解的Java类。
  2. 添加@ComponentScan注解,并指定需要扫描的包路径。
  3. 使用AnnotationConfigApplicationContext加载配置类。

5. 使用@Bean注解

即使在没有显式定义配置类的情况下,也可以使用@Bean注解在一个类中定义Bean。

示例

java">public class MyBeanConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}

步骤

  1. 创建一个Java类。
  2. 在类中定义带有@Bean注解的方法。
  3. 使用AnnotationConfigApplicationContext加载这个类。

6. 实现ApplicationListener

可以通过实现ApplicationListener接口,在Spring容器启动时动态注册Bean。

示例

java">public class StartupBeanRegister implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {ApplicationContext context = event.getApplicationContext();context.registerBeanDefinition("myBean", new RootBeanDefinition(MyBean.class));}
}

步骤

  1. 创建一个实现了ApplicationListener接口的类。
  2. 实现onApplicationEvent方法,在其中注册Bean定义。
  3. 将该类添加到Spring容器中。

7. 使用BeanDefinitionBuilder

可以通过BeanDefinitionBuilder来创建复杂的Bean定义,并手动注册到Bean工厂。

示例

java">public class MyBeanDefinitionRegistrar implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry, ConfigurableListableBeanFactory beanFactory) throws BeansException {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class);builder.addPropertyValue("property", "value");BeanDefinition definition = builder.getBeanDefinition();registry.registerBeanDefinition("myBean", definition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}

步骤

  1. 创建一个实现了BeanDefinitionRegistryPostProcessor接口的类。
  2. 实现postProcessBeanDefinitionRegistry方法,在其中使用BeanDefinitionBuilder创建Bean定义。
  3. 使用ApplicationContext加载这个类。

http://www.ppmy.cn/ops/93008.html

相关文章

【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch

JUC&#xff1a;java.util.concurrent 一、Callable 接⼝ 接口方法Callablecall&#xff0c;带有返回值Runnablerun&#xff0c;void所以创建一个线程&#xff0c;希望它给你返回一个结果&#xff0c;那么使用 Callable 更加方便一些 比如&#xff0c;创建一个线程&#xff…

【扒代码】regression_head.py

import torch from torch import nnclass UpsamplingLayer(nn.Module):# 初始化 UpsamplingLayer 类def __init__(self, in_channels, out_channels, leakyTrue):super(UpsamplingLayer, self).__init__() # 调用基类的初始化方法# 初始化一个序列模型&#xff0c;包含卷积层、…

Spring中dbUtil的概念和搭建使用

目录 1、什么是dbUtil 2、lombok插件 3、dbUtil通过xml来实现 4、SpringJunit的作用和效果 &#xff08;1&#xff09;标记测试方法和配置方法的注解 5、dbUtil通过注释来实现 6、dbUtil通过config配置类来实现 7、dbUtil通过aop的XML的实现 &#xff08;1&#xff09…

【WebRTC指南】对等连接

开始使用对等连接 点对点连接是 WebRTC 规范的一部分,该规范旨在对计算机上的两点应用进行连接,以使用点对点协议进行通信。对等设备之间的通信可以是视频、音频或任意二进制数据(适用于支持 RTCDataChannel API 的客户端)。为了发现两个对等端如何连接,两个客户端都需要…

Vue3详细介绍,正则采集器所用前端框架

Vue3 引入了一个全新的响应式系统&#xff0c;它是基于ES6的Proxy特性构建的。这个系统使得 Vue 能够更加高效地追踪数据的变化&#xff0c;并在数据发生变化时自动更新DOM。响应式系统的核心是"可观察"&#xff0c;当数据变化时&#xff0c;视图会响应这些变化并重新…

(回溯) LeetCode 40. 组合总和II

原题链接 一. 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: …

SQL注入之二次,加解密,DNS注入

加解密注入 在注入的时候&#xff0c;对变量做了加密操作&#xff0c;比如说?id1正常显示&#xff0c;但是代码对1进行了加密&#xff0c;这个时候想用?id1 and 11去判断&#xff0c;就得把1 and 11整体按照网站的方式加密&#xff0c;再去注入 二次注入 无法通过手动注入…

BP创建客户报错(尚未将分组 Z000 分配给任何客户账户组)

项目场景&#xff1a; SAP中使用BP创建客户主数据的&#xff0c;并保存 问题描述 尚未将分组 Z000 分配给任何客户账户组 消息号 FSBP_ECC004 原因分析&#xff1a; 后台配置有异常 解决方案&#xff1a; 处理方法&#xff1a; 路径&#xff1a; IMG->SAP用户化实施指南-…