日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

spring之BeanDefinition

作者:稻草人ZZ 更新時間: 2023-07-04 編程語言

spring之BeanDefinition

  • 編程式定義Bean示例代碼
  • BeanDefinitionReader
    • AnnotatedBeanDefinitionReader
      • 示例代碼
    • XmlBeanDefinitionReader
      • 示例代碼
    • ClassPathBeanDefinitionScanner
      • 示例代碼

BeanDefinition是一個接口,用來表示Bean定義。

BeanDefinition中存在很多屬性用來描述一個Bean的特點。比如:

  • class,表示Bean類型

  • scope,表示Bean作用域,單例或原型等

  • lazyInit:表示Bean是否是懶加載

  • initMethodName:表示Bean初始化時要執行的方法

  • destroyMethodName:表示Bean銷毀時要執行的方法

  • primary:表示相同bean存在時,那個是主要的bean

  • abstractFlag:表示是否是抽象類

  • 。。。。。。

在Spring中,我們經常會通過以下幾種方式來定義Bean:

  1. <bean/>
  2. @Bean
  3. @Component(@Service,@Controller)

這些,我們可以稱之申明式定義Bean。

和申明式事務、編程式事務類似,通過申明式方式所定義的Bean,最終都會被Spring解析為對應的BeanDefinition對象,并放入Spring容器中。

編程式定義Bean示例代碼

  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.3.20</version>
  </dependency>

  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.20</version>
  </dependency>
public class AppConfig {
    
}

public class User {


    public User() {
        System.out.println("無參構造");
    }


    public void   init() {
        System.out.println("初始化init方法");
    }
}

    public static void main(String[] args) {

        // 生成一個BeanDefinition對象,并設置beanClass為User.class,并注冊到ApplicationContext中
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        beanDefinition.setBeanClass(User.class);//設置bean的class類型
        beanDefinition.setScope("prototype"); // 設置作用域
        beanDefinition.setInitMethodName("init"); // 設置初始化方法
        beanDefinition.setLazyInit(true); // 設置懶加載

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.registerBeanDefinition("user", beanDefinition);

        System.out.println(context.getBean("user"));
    }

BeanDefinitionReader

BeanDefinitionReader是spring源碼中提供的BeanDefinition讀取器,這些BeanDefinitionReader在spring底層源碼中使用的非常多,相當于spring的基礎設施。

AnnotatedBeanDefinitionReader

可以直接把某個類轉換為BeanDefinition,并且會解析該類上的注解,比如:@Conditional,@Scope、@Lazy、@Primary、@DependsOn、@Role、@Description等。

示例代碼

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.core.annotation.Order;

@Scope(BeanDefinition.SCOPE_SINGLETON)
@Order(0)
@Lazy
@Primary
public class User {


    public User() {
        System.out.println("無參構造");
    }


    public void init() {
        System.out.println("初始化init方法");
    }
}
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(context);

        // 將User.class解析為BeanDefinition
        annotatedBeanDefinitionReader.register(User.class);

        BeanDefinition beanDefinition = annotatedBeanDefinitionReader.getRegistry().getBeanDefinition("user");
        System.out.println(beanDefinition.getScope());
        System.out.println(beanDefinition.isPrimary());
        System.out.println(beanDefinition.isSingleton());

        System.out.println(context.getBean("user"));
    }

XmlBeanDefinitionReader

可以解析<bean/>標簽。

示例代碼

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="user" class="top.mingempty.spring.service.User" scope="singleton" lazy-init="true" name="user">

    </bean>

</beans>
  public static void main(String[] args) {
      AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

      XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);
      int i = xmlBeanDefinitionReader.loadBeanDefinitions("spring.xml");
      System.out.println(i);
      BeanDefinition beanDefinition = context.getBeanDefinition("user");
      System.out.println(beanDefinition.getScope());
      System.out.println(beanDefinition.isPrimary());
      System.out.println(beanDefinition.isSingleton());
      System.out.println(context.getBean("user"));
  }

ClassPathBeanDefinitionScanner

ClassPathBeanDefinitionScanner是掃描器。可以掃描指定包路徑的類,并對掃描的類進行解析。掃描到的類上如果存在@Component注解,那么就會把這個類解析為一個BeanDefinition。

示例代碼

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Order(0)
@Lazy
@Primary
@Component
public class UserService {


    public void test() {
        System.out.println("demo");

    }
}
  public static void main(String[] args) {
      AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
      context.refresh();

      ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
      scanner.scan("top.mingempty.spring.service");

      BeanDefinition beanDefinition = context.getBeanDefinition("userService");
      System.out.println(beanDefinition.getScope());
      System.out.println(beanDefinition.isPrimary());
      System.out.println(beanDefinition.isSingleton());

      System.out.println(context.getBean("userService"));
      System.out.println(context.getBean("userService"));
  }

原文鏈接:https://blog.csdn.net/qq_41139119/article/details/131505464

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新