Bootstrap

Bean对象 和 普通对象 的区别

前言

在Spring框架中,我们通常将Spring容器管理的对象称为“Bean”或“Bean对象”。而通过new关键字创建的对象则被称为“对象”或“普通对象”。

Bean的概念

  • 在Spring框架中,Bean是指由Spring IoC(控制反转)容器管理的对象。
  • 这些对象可以是任何Java类的实例,如数据库连接、业务逻辑类、控制器等。
  • Bean的创建、初始化、属性注入和销毁等过程都由Spring容器负责。

与new创建的对象的区别

  • 通过new关键字创建的对象是普通的Java对象,它们不由Spring容器管理。
  • 这些对象的生命周期和依赖关系需要手动管理。
  • 相比之下,Spring Bean则享受Spring容器提供的各种服务,如依赖注入、生命周期管理等。

Spring Bean的优势

  • Spring Bean通过依赖注入降低了组件之间的耦合度。
  • 提高了代码的可测试性和可维护性。
  • 简化了对象的管理和生命周期控制

两者使用的关键点

当你在A类中使用了Spring管理的元素(比如通过@Autowired注入的依赖)时,这个A类本身也应该被Spring管理。同时这个A类的实例也不能在通过new关键字来创建。

问题java代码示例:

@Service  
public class SomeService {  
    // Some service methods...  
}  
  
public class A {  
    @Autowired  
    private SomeService someService;  
  
    public void doSomething() {  
        someService.someMethod(); // 如果someService是null,这里会抛出NullPointerException  
    }  
}  
  
public class B {  
    public void createAInstance() {  
        A aInstance = new A(); // A的实例不是通过Spring容器创建的  
        aInstance.doSomething(); // 如果doSomething方法试图使用someService,将会抛出异常  
    }  
}

在上面的例子中,A类中的someService字段是通过@Autowired注入的,但由于A的实例是通过new在B类中创建的,所以someService将会是null。当doSomething方法被调用时,由于它试图调用null对象的someMethod方法,因此会抛出NullPointerException。

正确java代码示例:

@Service  
public class SomeService {  
    // Some service methods...  
    public void someMethod() {  
        // Implementation  
    }  
}  
   
@Component
public class A {  
    @Autowired  
    private SomeService someService;  
  
    public void doSomething() {  
        someService.someMethod();  
    }  
}  
  
@Component
public class B {  
    @Autowired  
    private A aInstance;  
  
    public void performAction () {  
        // 实际上,这里不需要“创建”A的实例,因为aInstance已经是由Spring注入的  
        aInstance.doSomething();  
    }   
}  

总结

通常,被Spring框架管理的Bean(即Spring容器中的元素)不应该通过new关键字来直接创建。相反,它们应该通过Spring的依赖注入机制(如@Autowired注解)或直接从Spring的ApplicationContext中获取。

;