以前给容器中注册组件的方法也是可以用的。

比如:

  • 给类标注 @Component 代表它是一个组件
  • 给类标注 @Controller 代表它是一个控制器
  • 给类标注 @Service 代表它是一个业务逻辑组件
  • 给类标注 @Repository 代表它是一个数据库层组件

而且,只要组件写在默认的包扫描范围内,就可以被扫描到。

这些就不展开说了,都是以前的用法。

使用 @Import 给容器中导入组件

只要写在任何一个配置类或者组件里都行。

以配置类 MyConfig 举例:

  1. @Import({User.class, DBHelper.class})

image.png

作用:调用这两个组件的无参构造器,创建出指定的组件对象,放在容器中。

看一下是不是真的有注册进去,修改主程序类的 mian 方法:

  1. // 返回 IOC 容器
  2. ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
  3. // 查看容器里的组件
  4. String[] names = run.getBeanDefinitionNames();
  5. for (String name : names) {
  6. System.out.println(name);
  7. }
  8. // 从容器中获取组件
  9. Pet cat1 = run.getBean("cat01", Pet.class);
  10. Pet cat2 = run.getBean("cat01", Pet.class);
  11. System.out.println("******* 测试组件是否为单实例 **********************");
  12. System.out.println(cat1 == cat2);
  13. // 查看配置类组件
  14. MyConfig myConfig = run.getBean(MyConfig.class);
  15. System.out.println("******* 查看配置类组件 **********************");
  16. System.out.println(myConfig);
  17. // 外部调用配置类的
  18. User user1 = myConfig.user01();
  19. User user2 = myConfig.user01();
  20. System.out.println("******* 是从容器中获取,还是普通的方法调用? **********************");
  21. System.out.println(user1 == user2);

运行 main 方法,可以看到已经输出了两个组件的名字
image.png