- 项目中自定义的,使用@Component及其衍生注解
- 项目中引入第三方的,使用@Bean注解
两者在使用方式和作用对象上存在一些区别。
-
@Component:此注解主要作用于类级别。其功能是表明一个类会作为组件类,并告知Spring要为这个类创建bean。这通常通过类路径扫描自动配置bean来实现。
-
@Bean:此注解则主要作用于方法级别。它告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。因此,@Bean注解的自定义性更强,我们可以根据需要在某个特定的方法中定义产生这个bean。
@Component和@Bean都用于向Spring容器中注册bean,但使用场景和方式有所不同。@Component更侧重于类的自动装配,而@Bean则关注于通过特定方法生成bean实例。
使用第三方@Bean注解的小案例:
测试1:
配置类:
@Configuration //配置类
public class CommonConfig {
//声明第三方bean
@Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
//通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
public SAXReader reader(DeptService deptService){
System.out.println(deptService);
return new SAXReader();
}
}
测试类:
@Autowired
private SAXReader saxReader;
@Test
public void testGetBean2(){
Object saxReader = applicationContext.getBean("saxReader");
System.out.println(saxReader);
}
控制台输出:
测试2:
配置类:
@Configuration //配置类
public class CommonConfig {
//声明第三方bean
@Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
//通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
public SAXReader reader(DeptService deptService){
System.out.println(deptService);
return new SAXReader();
}
}
测试类:
@Autowired
private SAXReader saxReader;
@Test
public void testGetBean2(){
Object saxReader = applicationContext.getBean("reader");
System.out.println(saxReader);
}
控制台输出:
测试3(不建议):
引入相关依赖(Dom4j是一个用于处理XML文档的Java库,它提供了一种简单而强大的方式来解析和操作XML数据):
<!--Dom4j-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<emp>
<name>Tom</name>
<age>18</age>
</emp>
启动类方法:
//声明第三方bean
@Bean //将当前方法的返回值对象交给IOC容器管理,成为IOC容器bean
public SAXReader saxReader(){
return new SAXReader();
}
测试启动类:
@Autowired
private SAXReader saxReader;
//第三方bean的管理
@Test
public void testThirdBean() throws Exception {
//SAXReader saxReader = new SAXReader();
Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
Element rootElement = document.getRootElement();
String name = rootElement.element("name").getText();
String age = rootElement.element("age").getText();
System.out.println(name + " : " + age);
}
控制台输出: