栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

12.实例化Spring Bean(Spring Bean基础)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

12.实例化Spring Bean(Spring Bean基础)

文章目录
    • 常规方式实例化Bean
      • 1.通过构造器(配置元信息:XML、Java 注解和 Java API )
      • 2.通过静态工厂方法(配置元信息:XML 和 Java API )
      • 3.通过 Bean 工厂方法(配置元信息:XML和 Java API )
      • 4.通过 FactoryBean(配置元信息:XML、Java 注解和 Java API )
    • 特殊方式实例化Bean
      • 1.通过 ServiceLoaderFactoryBean(配置元信息:XML、Java 注解和 Java API )
      • 2.通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)
      • 3.通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)

常规方式实例化Bean
	public static void main(String[] args) {
        // 配置 XML 配置文件
        // 启动 Spring 应用上下文
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/meta-INF/bean-instantiation-context.xml");
        User user = beanFactory.getBean("user-by-static-method", User.class);
        User userByInstanceMethod = beanFactory.getBean("user-by-instance-method", User.class);
        User userByFactoryBean = beanFactory.getBean("user-by-factory-bean", User.class);
        System.out.println(user);
        System.out.println(userByInstanceMethod);
        System.out.println(userByFactoryBean);

        System.out.println(user == userByInstanceMethod);
        System.out.println(user == userByFactoryBean);

    }
1.通过构造器(配置元信息:XML、Java 注解和 Java API )
  • 通常XML配置的Bean通过调用构造器实例化
  • 通过@Component等注解
  • 通过@Bean配置,直接实例化
2.通过静态工厂方法(配置元信息:XML 和 Java API )
  • XML:
    	
    	
    	
    
  • Java API:静态工厂方法
3.通过 Bean 工厂方法(配置元信息:XML和 Java API )
  • XML:
    
    
    
    
    
  • Java API:@Bean 通过常规的API工厂方式实例化
4.通过 FactoryBean(配置元信息:XML、Java 注解和 Java API )
  • XML:
    UserFactoryBean实现了FactoryBean接口
    
    
    
    
特殊方式实例化Bean 1.通过 ServiceLoaderFactoryBean(配置元信息:XML、Java 注解和 Java API )
  • 背景
    SPI,全称Service Provider Interfaces,服务提供接口。是Java提供的一套供第三方实现或扩展使用的技术体系。主要通过解耦服务具体实现以及服务使用,使得程序的可扩展性大大增强,甚至可插拔。
    基于服务的注册与发现机制,服务提供者向系统注册服务,服务使用者通过查找发现服务,可以达到服务的提供与使用的分离,甚至完成对服务的管理。
    JDK中,基于SPI的思想,提供了默认具体的实现,ServiceLoader。利用JDK自带的ServiceLoader,可以轻松实现面向服务的注册与发现,完成服务提供与使用的解耦。
    完成分离后的服务,使得服务提供方的修改或替换,不会给服务使用方带来代码上的修改,基于面向接口的服务约定,提供方和使用方各自直接面向接口编程,而不用关注对方的具体实现。同时,服务使用方使用到服务时,也才会真正意义上去发现服务,以完成服务的初始化,形成了服务的动态加载。

  • java.util.ServiceLoader

    public final class ServiceLoader implements Iterable{
    	private static final String PREFIX = "meta-INF/services/";
    	...
    

    在实现类的jar包的meta-INF下新建一个文件夹services,并在services下新建一个文件,以接口的全限定名为文件名,内容为 实现类的全限定名。

    	ServiceLoader serviceLoader = load(UserFactory.class, Thread.currentThread().getContextClassLoader());
        Iterator iterator = serviceLoader.iterator();
        while (iterator.hasNext()) {
        	// 得到UserFactory的实现类
            UserFactory userFactory = iterator.next();
            // 创建user
            System.out.println(userFactory.createUser());
        }
    

XML:

	
        
    
		ServiceLoader serviceLoader = applicationContext.getBean("userFactoryServiceLoader", ServiceLoader.class);
        Iterator iterator = serviceLoader.iterator();
        while (iterator.hasNext()) {
            UserFactory userFactory = iterator.next();
            System.out.println(userFactory.createUser());
        }
2.通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)
	public static void main(String[] args) {
        // 配置 XML 配置文件
        // 启动 Spring 应用上下文
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/meta-INF/special-bean-instantiation-context.xml");
        // 通过 ApplicationContext 获取 AutowireCapableBeanFactory
        AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();

        // 创建 UserFactory 对象,通过 AutowireCapableBeanFactory
        UserFactory userFactory = beanFactory.createBean(DefaultUserFactory.class);
        System.out.println(userFactory.createUser());

    }
3.通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)

注册BeanDefinition时会实例化

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号