以前给容器中注册组件的方法也是可以用的。
比如:
- 给类标注 @Component 代表它是一个组件
- 给类标注 @Controller 代表它是一个控制器
- 给类标注 @Service 代表它是一个业务逻辑组件
- 给类标注 @Repository 代表它是一个数据库层组件
而且,只要组件写在默认的包扫描范围内,就可以被扫描到。
这些就不展开说了,都是以前的用法。
使用 @Import 给容器中导入组件
只要写在任何一个配置类或者组件里都行。
以配置类 MyConfig 举例:
@Import({User.class, DBHelper.class})
作用:调用这两个组件的无参构造器,创建出指定的组件对象,放在容器中。
看一下是不是真的有注册进去,修改主程序类的 mian 方法:
// 返回 IOC 容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
// 查看容器里的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
// 从容器中获取组件
Pet cat1 = run.getBean("cat01", Pet.class);
Pet cat2 = run.getBean("cat01", Pet.class);
System.out.println("******* 测试组件是否为单实例 **********************");
System.out.println(cat1 == cat2);
// 查看配置类组件
MyConfig myConfig = run.getBean(MyConfig.class);
System.out.println("******* 查看配置类组件 **********************");
System.out.println(myConfig);
// 外部调用配置类的
User user1 = myConfig.user01();
User user2 = myConfig.user01();
System.out.println("******* 是从容器中获取,还是普通的方法调用? **********************");
System.out.println(user1 == user2);
运行 main 方法,可以看到已经输出了两个组件的名字