• Javaweb之SpringBootWeb案例之 Bean管理的第三方Bean的详细解析


    2.3 第三方Bean

    学习完bean的获取、bean的作用域之后,接下来我们再来学习第三方bean的配置。

    之前我们所配置的bean,像controller、service,dao三层体系下编写的类,这些类都是我们在项目当中自己定义的类(自定义类)。当我们要声明这些bean,也非常简单,我们只需要在类上加上@Component以及它的这三个衍生注解(@Controller、@Service、@Repository),就可以来声明这个bean对象了。 但是在我们项目开发当中,还有一种情况就是这个类它不是我们自己编写的,而是我们引入的第三方依赖当中提供的。

    在pom.xml文件中,引入dom4j:

    1. <dependency>
    2.    <groupId>org.dom4jgroupId>
    3.    <artifactId>dom4jartifactId>
    4.    <version>2.1.3version>
    5. dependency>

    dom4j就是第三方组织提供的。 dom4j中的SAXReader类就是第三方编写的。

    当我们需要使用到SAXReader对象时,直接进行依赖注入是不是就可以了呢?

    • 按照我们之前的做法,需要在SAXReader类上添加一个注解@Component(将当前类交给IOC容器管理)

    结论:第三方提供的类是只读的。无法在第三方类上添加@Component注解或衍生注解。

    那么我们应该怎样使用并定义第三方的bean呢?

    • 如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component 及衍生注解声明bean的,就需要用到@Bean注解。

    解决方案1:在启动类上添加@Bean标识的方法

    1. @SpringBootApplication
    2. public class SpringbootWebConfig2Application {
    3.    public static void main(String[] args) {
    4.        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    5.   }
    6.    //声明第三方bean
    7.    @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
    8.    public SAXReader saxReader(){
    9.        return new SAXReader();
    10.   }
    11. }

    xml文件:

    1. "1.0" encoding="UTF-8"?>
    2. <emp>
    3.    <name>Tomname>
    4.    <age>18age>
    5. emp>

    测试类:

    1. @SpringBootTest
    2. class SpringbootWebConfig2ApplicationTests {
    3.    @Autowired
    4.    private SAXReader saxReader;
    5.    //第三方bean的管理
    6.    @Test
    7.    public void testThirdBean() throws Exception {
    8.        Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
    9.        Element rootElement = document.getRootElement();
    10.        String name = rootElement.element("name").getText();
    11.        String age = rootElement.element("age").getText();
    12.        System.out.println(name + " : " + age);
    13.   }
    14.    //省略其他代码...
    15. }

    重启SpringBoot服务,执行测试方法后,控制台输出日志:

    Tom : 18

    说明:以上在启动类中声明第三方Bean的作法,不建议使用(项目中要保证启动类的纯粹性)

    解决方案2:在配置类中定义@Bean标识的方法

    • 如果需要定义第三方Bean时, 通常会单独定义一个配置类

    1. @Configuration //配置类 (在配置类当中对第三方bean进行集中的配置管理)
    2. public class CommonConfig {
    3.    //声明第三方bean
    4.    @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
    5.          //通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
    6.    public SAXReader reader(DeptService deptService){
    7.        System.out.println(deptService);
    8.        return new SAXReader();
    9.   }
    10. }

    注释掉SpringBoot启动类中创建第三方bean对象的代码,重启服务,执行测试方法,查看控制台日志:

    Tom : 18

    在方法上加上一个@Bean注解,Spring 容器在启动的时候,它会自动的调用这个方法,并将方法的返回值声明为Spring容器当中的Bean对象。

    注意事项 :

    • 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。

    • 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

    关于Bean大家只需要保持一个原则:

    • 如果是在项目当中我们自己定义的类,想将这些类交给IOC容器管理,我们直接使用@Component以及它的衍生注解来声明就可以。

    • 如果这个类它不是我们自己定义的,而是引入的第三方依赖当中提供的类,而且我们还想将这个类交给IOC容器管理。此时我们就需要在配置类中定义一个方法,在方法上加上一个@Bean注解,通过这种方式来声明第三方的bean对象。

  • 相关阅读:
    靠谱的车【华为OD机试-JAVA&Python&C++&JS】
    计算机毕业设计JAVA百姓点评网的设计与实现mybatis+源码+调试部署+系统+数据库+lw
    航空发动机轴承数据集 | 写论文再也不用担心没数据集啦!
    关于数据中台的理解和思考
    Git使用教程
    Ubuntu 23.10:内网安装rapidocr_paddle(GPU)及其前置准备
    java毕业设计网站javaweb机房课表管理系统
    某央企下属电子集团组织提升咨询项目成功纪实
    Windows系统webp图片预览插件
    Mac 禁用一些高占用cup的进程
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/136355164