04-Spring Bean注入方式

本文介绍了Spring框架中依赖注入的三种方式:构造器注入、setter注入和接口注入,并详细解释了这些注入方式背后的实现原理和技术细节。

实现IOC容器主要有两种方式:

1,依赖查找

2,依赖注入,Spring采用的是依赖注入的方式

依赖注入又分为3种方式:

2.1 构造器注入

2.2 setter注入

2.3 接口注入

构造器注入和setter注入背后都是采用反射的技术来实现。

接口注入,通常是指资源并非来自系统自身,而是来自系统外。

比如我们可以在tomcat下配置数据源,然后在程序里面通过JNDI的方式去获取该数据源,这种方式就称为接口注入

说明下,我写文章主要是针对有一定经验的开发人员,因为在工作中,经常发现大家基本是会用,但是对一些基本的原理是一知半解,导致出现问题都是这里改改,那里改改,这样也能解决问题,但是效率很低。

所以想出系列文章,帮助大家把这些点理顺,比较简单的代码我就不写了,还请见谅。

<think> 嗯,用户想了解Spring Bean注入方式。之前系统提示要参考站内引用,现在有五条相关引用内容需要分析。 引用[1]明确提到了多种注入方式:注解方式如@Autowired、@Bean等,以及XML方式如构造器注入、setter注入。引用[2]补充了@Import和FactoryBean这两种进阶方式。引用[3]提到BeanDefinitionRegistryPostProcessor这种底层接口方式。引用[4]展示了XML配置setter注入的具体示例。引用[5]则证实了BeanDefinitionRegistryPostProcessor的实际输出效果。 用户的问题很直接,就是询问Spring Bean注入方式。需要把分散在多个引用中的信息整合成完整体系。考虑按配置方式分两大类:基于XML和基于注解。XML部分要包含构造器注入、setter注入这些传统方式;注解部分则要覆盖@Autowired、@Bean等现代用法。对于FactoryBeanBeanDefinitionRegistryPostProcessor这些特殊机制,虽然使用频率较低,但作为完整知识体系也应该包含。 特别注意引用[3]和[5]提到的BeanDefinitionRegistryPostProcessor,这是通过编程方式动态注册Bean的高级技巧,适合框架开发者使用。而引用[4]展示的XML配置示例很有教学意义,可以转化为代码片段增强说明性。用户可能是中级开发者,所以回答既要全面又不能太晦涩,需要平衡深度和易懂性。 相关问题的设计也要有层次:从基础(各种方式区别)到进阶(设计原理),最后结合实际场景(依赖冲突处理)。这样既能解答当前问题,又能引导用户深入思考。 </think> 根据引用内容,Spring Bean注入方式可分为以下两大类,每类包含多种具体实现: --- ### **一、基于注解的注入方式** 1. **组件扫描 + `@Autowired`** - 使用 `@Component`/`@Service`/`@Repository`/`@Controller` 标注类 - 通过 `@Autowired` 自动注入依赖(可加在字段、构造器或Setter上) ```java @Service public class UserService { @Autowired private UserRepository userRepo; // 字段注入 } ``` 2. **`@Configuration` + `@Bean`** - 在配置类中显式定义 Bean ```java @Configuration public class AppConfig { @Bean public DataSource dataSource() { return new DriverManagerDataSource(); } } ``` 3. **构造函数注入(推荐)** - 省略 `@Autowired`(Spring 4.3+ 支持隐式注入) ```java @Service public class OrderService { private final PaymentService paymentService; // 构造器自动注入 public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } } ``` 4. **`@Value` 注入属性值** - 从配置文件中读取值 ```java @Component public class MailService { @Value("${mail.host}") private String host; } ``` 5. **`@Primary` 标注优先Bean** - 存在多个同类型Bean时指定首选 ```java @Bean @Primary public NotifyService smsNotify() { ... } ``` 6. **`@Import` 导入配置类** - 快速引入其他配置类中的Bean ```java @Configuration @Import({DatabaseConfig.class, SecurityConfig.class}) public class AppConfig { ... } ``` --- ### **二、基于XML的注入方式** 1. **构造器注入** ```xml <bean id="userService" class="com.example.UserService"> <constructor-arg ref="userRepository"/> <!-- 引用其他Bean --> <constructor-arg value="100"/> <!-- 基本类型值 --> </bean> ``` 2. **Setter注入** ```xml <bean id="order" class="twm.spring.start.Order"> <property name="notifyservice" ref="notify"/> <!-- 引用示例见引用[4] --> </bean> ``` 3. **集合注入** ```xml <bean id="collectionBean" class="com.example.CollectionBean"> <property name="list"> <list> <value>item1</value> <ref bean="bean2"/> </list> </property> </bean> ``` 4. **自动装配(Autowiring)** ```xml <bean id="service" class="com.example.Service" autowire="byType"/> ``` --- ### **三、扩展注入方式** 1. **`FactoryBean` 接口** - 自定义复杂对象的创建逻辑 ```java public class MyFactoryBean implements FactoryBean<MyObject> { @Override public MyObject getObject() { return new MyObject(); // 返回实际Bean } } ``` 2. **`BeanDefinitionRegistryPostProcessor`** - 编程式动态注册Bean(底层API) ```java public class CustomPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { RootBeanDefinition beanDef = new RootBeanDefinition(MyBean.class); registry.registerBeanDefinition("myBean", beanDef); // 动态注册 } } ``` --- ### 总结对比 | **方式** | 适用场景 | 特点 | |----------------------|----------------------------------|--------------------------| | 注解扫描 + `@Autowired` | 现代Spring项目 | 简洁,依赖自动发现 | | `@Configuration` | 需精细控制Bean创建逻辑 | 显式配置,灵活性高 | | 构造器注入 | 强依赖场景(推荐) | 避免循环依赖,线程安全 | | XML配置 | 遗留项目或非Java配置需求 | 集中管理,与代码解耦 | | `FactoryBean` | 创建过程复杂的Bean(如代理对象) | 封装创建逻辑 | | `BeanDefinitionRegistryPostProcessor` | 框架扩展或动态注册 | 底层控制,灵活性最高 [^5] | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值