Spring系列(七):@FactoryBean注解用法介绍

简介: FactoryBean是实现了FactoryBean<T>接口的Bean,可以该Bean的ID从BeanFactory中获取的实际上是FactoryBean中getObject()方法返回的实例对象,而并不是直接FactoryBean本身,想要获取FactoryBean对象本身,可以在id前面加一个&符号来获取

今天给大家介绍@FactoryBean注解用法,希望对大家能有所帮助!

image_e4095870.png

1、@FactoryBean注解介绍

FactoryBean是实现了FactoryBean接口的Bean,可以该Bean的ID从BeanFactory中获取的实际上是FactoryBean中getObject()方法返回的实例对象,而并不是直接FactoryBean本身,想要获取FactoryBean对象本身,可以在id前面加一个&符号来获取。

BeanFactory部分代码:

说明:String FACTORY\_BEAN\_PREFIX = "&" ,&符号表示要获取FactoryBean本身

package org.springframework.beans.factory;


import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;


public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";}

2、@FactoryBean的源码内容如下:

Spring3.0版本之后,FactoryBean开始支持泛型,即接口声明改为FactoryBean的形式

package org.springframework.beans.factory;


import org.springframework.lang.Nullable;


public interface FactoryBean<T> {
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";


    @Nullable
    T getObject() throws Exception;


    @Nullable
    Class<?> getObjectType();


    default boolean isSingleton() {
        return true;
    }
}

实现FactoryBean接口有一下三个方法

  • getObject:获取bean对应的实例对象
  • getObjectType:获取factoryBean获取到的实例类型
  • isSingleton:factoryBean创建的实例是否是单实例

3、用法示例

3.1 新建Book.java

package com.spring.bean;


public class Book {
    private String bookName;
    private String bookType;
    private double price;


    public Book(String bookName, String bookType, double price) {
        this.bookName = bookName;
        this.bookType = bookType;
        this.price = price;
    }


    public String getBookName() {
        return bookName;
    }


    public void setBookName(String bookName) {
        this.bookName = bookName;
    }


    public String getBookType() {
        return bookType;
    }


    public void setBookType(String bookType) {
        this.bookType = bookType;
    }


    public double getPrice() {
        return price;
    }


    public void setPrice(double price) {
        this.price = price;
    }


    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", bookType='" + bookType + '\'' +
                ", price=" + price +
                '}';
    }
}

3.2 新建BookFactoryBean.java

package com.spring.bean;




import org.springframework.beans.factory.FactoryBean;




public class BookFactoryBean implements FactoryBean<Book> {
    public BookFactoryBean factoryBeanVO() {
        return new BookFactoryBean();
    }


    public Book getObject() throws Exception {
        return new Book("红楼梦", "中国名著", 88);
    }


    public Class<?> getObjectType() {
        return Book.class;
    }


    public boolean isSingleton() {
        return true;
    }
}

3.3 FactoryBeanConfig.java

package com.spring.config;

import com.spring.bean.BookFactoryBean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FactoryBeanConfig  {
    @Bean
    public BookFactoryBean bookFactoryBean()
    {
        return new BookFactoryBean();
    }
}

3.4 TestFactoryBean.java

package com.spring.test;


import com.spring.config.FactoryBeanConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class TestFactoryBean {


    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(FactoryBeanConfig.class);
        // 获取工厂类的bean
        Object bookFactoryBean = annotationContext.getBean("bookFactoryBean");
        System.out.println(bookFactoryBean.getClass());
        // 输出结果:class com.spring.bean.Book
        //获取FactoryBean 本身 加 &符号
        Object bookFactoryBean1 = annotationContext.getBean("&bookFactoryBean");
        System.out.println(bookFactoryBean1.getClass());
        // 输出结果:class com.spring.bean.BookFactoryBean
    }
}

4、@FactoryBean应用场景

  • 单一的对象使用FactoryBean意义不大。
  • 创建对象时需要依赖于需要别的接口来监听数据、根据推送数据过来的接口做一些数据处理。
  • 搭配其他接口协作, 依赖于Spring生命周期, 针对某个时间节点、合适的条件判断,来生成自己需要的对象。

5、典型应用

  • MyBatis3 提供 mybatis-spring项目中的 org.mybatis.spring.SqlSessionFactoryBean:
  • 阿里开源的分布式服务框架 Dubbo 中的Consumer 也使用到了FactoryBean
  • shiro中ShiroFilterFactoryBean
  • druid的JdbcStatManagerFactoryBean
相关文章
|
11天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
137 73
|
6天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
40 21
|
11天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
11天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
2月前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
48 4
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
144 2
|
2月前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
59 2
|
2月前
|
消息中间件 Java 数据库
解密Spring Boot:深入理解条件装配与条件注解
Spring Boot中的条件装配与条件注解提供了强大的工具,使得应用程序可以根据不同的条件动态装配Bean,从而实现灵活的配置和管理。通过合理使用这些条件注解,开发者可以根据实际需求动态调整应用的行为,提升代码的可维护性和可扩展性。希望本文能够帮助你深入理解Spring Boot中的条件装配与条件注解,在实际开发中更好地应用这些功能。
43 2
|
2月前
|
JSON Java 数据格式
springboot常用注解
@RestController :修饰类,该控制器会返回Json数据 @RequestMapping(“/path”) :修饰类,该控制器的请求路径 @Autowired : 修饰属性,按照类型进行依赖注入 @PathVariable : 修饰参数,将路径值映射到参数上 @ResponseBody :修饰方法,该方法会返回Json数据 @RequestBody(需要使用Post提交方式) :修饰参数,将Json数据封装到对应参数中 @Controller@Service@Compont: 将类注册到ioc容器
|
2月前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
102 0