直接new 对象 Spring 不会注入的解决方法

整合Spring Context
本文介绍了一种将遗留系统与Spring框架整合的方法,通过创建一个实现了ApplicationContextAware接口的类,并在Spring配置文件中定义bean来实现对Spring管理的bean的引用。

1.建一个类实现ApplicationContextAware接口,有一个引用ApplicationContext的静态成员,然后,遗留系统需要引用spring管理的bean的地方,使用这个类。

package com.eliteams.quick4j.web.utils;

import com.eliteams.quick4j.web.listenner.ListennerTask;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

/**
 * Created by 18358 on 2016/11/25.
 */
public class SpringContext implements ApplicationContextAware {
    protected static ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    public static ApplicationContext getContext() {

        return context;
    }
}

2.然后在spring配置文件里加

<bean id="springContext" class="com.eliteams.quick4j.web.utils.SpringContext"></bean>

3.其它类中涉及到引用时 采用下面的方法即可解决,当然自己也可以写个通用的工厂类方法

 MyBean myBean = (MyBean) SpringContext.getContext().getBean("myBean"); 
<think>好的,我现在需要回答用户关于Spring框架中注入对象和使用new关键字创建对象的区别的问题。首先,我得回忆一下Spring的核心概念,比如IoC(控制反转)和DI(依赖注入)。用户可能已经了解了一些基本知识,但需要更详细的对比。 根据用户提供的引用内容,特别是引用[1]、[3]和[4],可以看出Spring通过配置文件或注解来管理对象的创建,而new直接实例化对象。我需要明确两者在控制权、耦合度、生命周期管理、依赖管理等方面的不同。 首先,控制权方面,Spring的IoC容器负责对象的创建和注入,而new是由开发者主动控制。这点在引用[3]中提到,控制反转改变了获取对象的方式,从程序员主动new变为从容器获取。 其次,耦合度的问题。使用new会导致类之间的直接依赖,增加耦合,而Spring通过依赖注入降低了耦合,引用[3]中的依赖注入部分解释了这一点,对象的依赖由容器注入,而不是硬编码在类中。 然后是生命周期管理,Spring管理的对象可以有更复杂的生命周期,比如单例、原型等作用域,而new每次都会创建新实例。引用[1]中的bean配置说明了Spring如何声明和管理对象。 另外,依赖管理方面,Spring能够自动处理对象之间的依赖关系,而使用new需要手动处理,这在引用[5]的测试示例中有所体现,通过IoC容器获取bean实例,依赖已经注入好了。 还要考虑测试的便利性,使用Spring注入对象更容易替换为mock对象,而new对象在测试可能需要修改代码,引用[4]中提到的问题,即手动new对象无法被Spring管理,导致注入失效,这也说明了测试中的困难。 需要确保回答结构清晰,分点说明区别,并引用相关的引用内容来支持每个点。同,生成的相关问题要围绕Spring对象管理、IoC和DI的优势、实际应用中的问题等方面展开。 最后,检查是否符合格式要求:行内公式用$...$,独立公式用$$...$$,正确使用中文,引用标识正确放置,并生成相关问题。确保LaTeX语法正确,但当前问题可能不涉及数学公式,所以可能不需要使用。不过如果有提到算法或数学概念,再考虑添加,但这里可能不适用。 总结回答结构,分点列出区别,每个点结合引用内容,最后生成相关问题。需要确保回答真实可靠,参考提供的引用内容,特别是Spring的配置、对象管理、IoC和DI的解释。</think>### Spring框架注入对象new关键字创建对象的区别 #### 1. **控制权归属** - **Spring注入**:对象的创建和生命周期由IoC容器管理,开发者通过配置(XML或注解)声明对象,容器负责实例化并注入依赖[^3]。例如: ```xml <bean id="someService" class="com.example.SomeServiceImpl"/> ``` 容器会自动创建`SomeServiceImpl`的实例,并存储在内部的Map中[^1]。 - **new关键字**:开发者直接控制对象的创建,例如`SomeService service = new SomeServiceImpl();`。对象的生命周期完全由代码逻辑决定。 #### 2. **耦合度差异** - **Spring注入**:通过依赖注入(DI)解耦,类仅依赖接口或抽象,具体实现由容器注入。例如: ```java @Autowired private SomeService service; // 无需关心具体实现类 ``` 这种模式符合“面向接口编程”原则,降低模块间的耦合[^3]。 - **new关键字**:类直接依赖具体实现,若需更换实现类,必须修改代码。例如: ```java SomeService service = new SomeServiceImpl(); // 硬编码依赖 ``` 这种强耦合在大型项目中会提高维护成本。 #### 3. **生命周期管理** - **Spring注入**:支持多种作用域(如单例`singleton`、原型`prototype`)。例如,单例模式全局共享同一实例: ```xml <bean id="user" class="com.example.User" scope="singleton"/> ``` 对象的初始化、销毁可通过回调方法(如`@PostConstruct`、`@PreDestroy`)管理[^3]。 - **new关键字**:每次调用`new`都会生成新实例,生命周期完全由开发者手动控制,缺乏统一管理。 #### 4. **依赖管理能力** - **Spring注入**:自动解析并注入复杂依赖关系。例如,若对象A依赖对象B,容器会自动创建B并注入到A中: ```xml <bean id="a" class="com.example.A"> <property name="b" ref="b"/> </bean> <bean id="b" class="com.example.B"/> ``` 开发者无需手动处理依赖链[^5]。 - **new关键字**:需显式处理所有依赖,例如: ```java A a = new A(new B()); // 需手动传递依赖 ``` 在多层依赖中,代码会变得冗长且难以维护。 #### 5. **可测试性与扩展性** - **Spring注入**:依赖可替换为Mock对象(如通过`@Mock`注解),方便单元测试。例如: ```java @Test public void testService() { SomeService mockService = Mockito.mock(SomeService.class); // 注入Mock对象进行测试 } ``` - **new关键字**:测试需重构代码或使用反射修改私有字段,侵入性较强[^4]。 #### 6. **配置与代码分离** - **Spring注入**:通过配置文件或注解声明对象,修改实现类仅需调整配置,无需改动业务代码。例如,更换数据库实现: ```xml <bean id="dataSource" class="com.example.NewDataSource"/> ``` - **new关键字**:实现类变更需修改所有相关代码,例如: ```java // 旧代码 DataSource ds = new OldDataSource(); // 修改为 DataSource ds = new NewDataSource(); // 需逐个替换 ``` --- ### 总结对比表 | **维度** | **Spring注入** | **new关键字** | |------------------|----------------------------------------|-----------------------------------| | 控制权 | IoC容器管理 | 开发者手动控制 | | 耦合度 | 低(依赖接口) | 高(依赖具体实现) | | 生命周期 | 支持多种作用域 | 每次`new`生成新实例 | | 依赖管理 | 自动注入复杂依赖 | 需手动传递依赖 | | 可测试性 | 易替换为Mock对象 | 需侵入性修改 | | 配置灵活性 | 通过配置调整实现类 | 需修改代码逻辑 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值