有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java:Springbeans的真正工作原理

我是Spring的新手,我正在努力理解基本概念。从我的观点来看,一个重要的概念是SpringBean,在这里,我在完全理解它们时遇到了一个问题,因为来自internet的资源将旧的java代码(EJB)与spring注释混合在一起,对于我来说,不太清楚什么是绝对必要的

例如,我试图了解autowired在以下基本示例中的工作原理:

@Component("fooFormatter")
class FooFormatter {
public String format() {
    return "foo";
  }
}

class FooService {
@Autowired
private  FooFormatter fooFormatter;

public  void print() {
    System.out.println(fooFormatter.format());
  }
}

 public class App{
 public static void main(String [] args) {
    FooService fo = new FooService();
    fo.print();
   }
 }

我已经了解到,大体上我正在创建一个新对象,它不是由spring容器管理的,但是对象类型是FooService但是FooFormatter,我不明白为什么不起作用
再说一次,如果我使用spring注释,是否需要为bean配置添加一个文件? 我知道这是一个虚拟的问题,如果你知道一些好的资源来详细解释这一点,请把它留在这里(直到现在我还没有找到一些资源来澄清这一点)

多谢各位


共 (3) 个答案

  1. # 2 楼答案

    了解更多细节。正如我所做的,要知道组件类何时被实例化,请创建一个空白构造函数,并在其中打印一些值

    @Component
    public class ComponentClass{
      public ComponentClass(){
        //constructor will be called when autowired
        System.out.println("ComponentClass is instanciated at "+new Date().toString()); 
      }
    
    
    }
    
  2. # 3 楼答案

    为了让Spring在FooService中注入一些东西,FooService也应该是一个可管理的bean。否则,Spring怎么会知道呢?它基本上查找由注释标记的类。如果一个类没有@Component注释,那么Spring将不会管理这个类

    使用

    @Service
    class FooService {
    

    创建一个ApplicationContext

    ApplicationContext context = ...;
    

    要个豆子

    FooService service = context.getBean(FooService.class);
    

    春天不是一个神奇的工具FooService fo = new FooService();对它没有影响。应该在某个时候创建Spring上下文,它将注册要管理的类,并且您将能够查询托管bean

    阅读:

    docs.spring.io/spring/docs/current/spring-framework-reference是我读过的最好的文档之一。阅读“核心”部分