Day14-04.bean的管理-第三方bean
之前我们配置的bean,像controller、service、dao、还有一部分工具类,都是我们在项目中自己定义的,我们自己定义的类要声明bean很简单,只需要在类上加上conponent或者三个衍生注解就可以来声明这个bean对象了。但是我们项目开发中还有一种情况,就是这个类不是我们自己定义的,是我们引入的第三方依赖当中提供的。比如我们引入的依赖dom4j,这个依赖就是之前学习xml的时候,我们解析xml文件就需要用到这个依赖。依赖引入进来之后,接下来我们就可以去new saxReader这么一个对象,通过这个对象当中的方法来读取xml文件,然后对里面的文件内容进行解析。如果我们按照这种方式解析xml文件,每一次解析都需要创建一个saxReader对象,这是比较耗费资源的,而我们现在使用了Spring这个框架了,我们就不需要每一次来new这个对象了,我们完全可以把这个对象交给Spring的IOC容器管理,我们需要用到这个对象的时候直接进行依赖注入就可以了。
按照我们之前的做法就需要在saxReader这个类上面加上一个注解component来指定将这个类交个Spring的IOC容器管理。但是这些文件是只读的权限,也就是说我们没办法在这个类上加@Compoennt注解来声明bean对象。所以我们现在要声明bean就不能按照之前的思想了,此时我们需要用到另外一个注解@Bean。
(1)第三方bean
如果我们要管理的bean对象来自于第三方(不是自定义的),是没办法用@Component及其衍生注解来声明bean的,就需要用到@Bean注解。这么使用这个@Bean注解来定义第三方的bean呢?
最简单的方式就是直接在启动类中再来定义一个方法,然后指定方法的返回值就是我们要定义的bean对象SAXReader,,方法名任意,然后我们就可以在这个方法中构造bean对象,最关键的是要在这个方法的上面加上bean注解,一旦加了这个bean注解,Spring框架就知道需要将这个方法执行的返回值对象交给IOC容器管理,成为IOC容器当中的bean对象。接下来其他地方要想使用到这个对象,直接依赖注入就可以了。
// 启动类
@SpringBootApplication
public class SpringbootWebConfig2Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootWebConfig2Application.class, args);
}
@Bean // 将方法的返回值对象交给IOC容器,成为IOC容器中的bean对象
public SAXReader saxReader() {
return new SAXReader();
}
}
// 测试类
// 原始方式
@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); // Tom : 18
}
// IOC容器注入对象
@Autowired
private SAXReader saxReader;
//第三方bean的管理
@Test
public void testThirdBean() throws Exception {
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); // Tom : 18
}
这种方式是直接把第三方bean定义在了启动类当中,这种方式不建议。在项目开发中,我们要尽量保持启动类的纯粹性,一般只是用来启动项目。如果要定义第三方bean,一般单独定义一个配置类。通过@Configuration声明一个配置类,在这个配置类中对第三方bean进行集中的管理。
@Configuration
public class CommonConfig {
@Bean // 将方法的返回值对象交给IOC容器,成为IOC容器中的bean对象
public SAXReader saxReader() {
return new SAXReader();
}
}
测试类也正常运行了,没问题!
(2)第三方bean的名称是什么呢?
我们以前定义的bean,可以在@Component以及其衍生注解后面通过value指定bean的名字,如果没有指定就是默认类名首字母小写。那么我们的第三方bean的名字是什么呢?CTRL + 鼠标左键点击@Bean,会发现里面有两个属性,
我们可以通过这两个属性来指定第三方bean的名称,如果没有指定,默认是方法名,也就是说我们前面的SAXReader这个bean的名字就是方法名saxReader。
通过测试发现,如果名字是saxReader,用getBean(“saxReader”)可以获取bean对象,但是getBean(“reader”)就报错找不到Bean。但是如果方法名改成reader,又获取到bean对象了。
(3)声明第三方bean的时候需要依赖注入怎么办?
之前我们自己定义的bean对象,要想进行依赖注入通过@Autowird。现在如果是第三方需要进行依赖注入怎么办呢?
非常简答,直接在定义第三方bean的方法当中,指定对应的方法形参就可以了。比如现在我想注入deptService,就直接写DeptService deptService就可以了,此时Spring容器会进行自动装备,根据这个类型(DeptControlelr类型)去IOC容器当中找到这个bean对象,然后完成注入操作。
@Configuration
public class CommonConfig {
@Bean // 将方法的返回值对象交给IOC容器,成为IOC容器中的bean对象
public SAXReader saxReader(DeptService deptService) {
System.out.println(deptService);
return new SAXReader();
}
}
启动项目会发现,Spring容器在启动的过程中,他会自动的调用这个方法(saxReader),并且根据我们所指定的类型到IOC容器中找到对应的bean对象,并完成自动装配。
我们在定义第三方bean的时候,一般建议定义一个配置类,然后在配置类中定义一个方法,然后加上一个@Bean注解,一旦加上了@Bean注解,那么Spring容器在启动的时候他会自动的调用这个方法,然后把这个方法的返回值声明为Spring容器中的Bean对象。
(4)第三方bean
1、如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component及其衍生注解声明bean的,就需要用到@Bean注解。
2、若要管理的是第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。
(5)注意事项
1、通过@Bean注解的name或者value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
2、如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
L0F-1719745675652)]
2、如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。