Day14-04.bean的管理-第三方bean

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定义方法中设置形参即可,容器会根据类型自动装配。

在这里插入图片描述

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值