spring的bean扫描

1.实现BeanDefinitionRegistryPostProcessor接口进行初始化

/**
 * bean扫描初始化
 */
public class BaseConfigurer implements BeanDefinitionRegistryPostProcessor {


    private String pojoPackage;
    private VSessionFactory sessionFactory;


    public void setPojoPackage(String basePackage) {
        this.pojoPackage = basePackage;
    }
    public void setSessionFactory(VSessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // TODO Auto-generated method stub

    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

        PojoScanner pojoScanner = new PojoScanner(registry);
        pojoScanner.setSessionFactory(sessionFactory);
        pojoScanner.registerFilters();
        pojoScanner.scan(pojoPackage);
    }

}

BeanDefinitionRegistryPostProcessor接口的结构如图:

这里写图片描述

BeanFactoryPostProcessor接口是Spring提供的接口可使程序可以嵌入Spring的加载过程。Spring会在BeanFactory的相关处理完成后调用postProcessBeanFactory方法,进行定制的功能。
而BeanDefinitionRegistryPostProcessor接口继承于BeanFactoryPostProcessor接口。

BeanDefinitionRegistryPostProcessor接口方法:

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException方法:
在此接口下调用进行bean的注册

2.继承ClassPathBeanDefinitionScanner类,对扫描的结果进行自定义处理。

/**
 * 扫描bean并进行处理
 */
public class PojoScanner extends ClassPathBeanDefinitionScanner{

    private VSessionFactory sessionFactory;

    public PojoScanner(BeanDefinitionRegistry registry) {
        super(registry, false);
    }



    public void registerFilters() {
        this.addIncludeFilter(new TypeFilter() {
            @Override
            public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
                    throws IOException {
                String anno = Table.class.getCanonicalName();
                return metadataReader.getAnnotationMetadata().hasAnnotation(anno);
            }
        });
    }

    @Override
    public int scan(String... basePackages) {
        Environment environment = sessionFactory.getEnvironment();
        int count = 0;
        for (String basePackage : basePackages) {
            Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
            for (BeanDefinition candidate : candidates) {
                Class<?> clazz;
                try {
                    clazz = Class.forName(candidate.getBeanClassName());
                } catch (ClassNotFoundException e) {
                    throw new IllegalArgumentException("Class not found");
                }
                String key = clazz.getAnnotation(Table.class).value();

                MappedBeanResult mppedResult = new MappedBeanResult(clazz);
                for (Field field : clazz.getDeclaredFields()) {
                    Column column = field.getAnnotation(Column.class);
                    String name = column==null ? field.getName() : column.value();
                    mppedResult.put(name, field);
                }
                environment.putResult(key, mppedResult);
                count++;
            }
        }
        return count;
    }


    public VSessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(VSessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}

ClassPathBeanDefinitionScanner类下的几个方法:

protected void registerDefaultFilters()方法:

过滤掉包下不需要的类

public int scan(String… basePackages) :
对扫描的包下的类进行处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring通过扫描指定的包路径来查找bean定义,并将它们注册到应用程序上下文中。Spring使用`@ComponentScan`注解来指定需要扫描的包路径。当使用`@ComponentScan`注解时,Spring扫描所有被`@Component`、`@Service`、`@Repository`和`@Controller`注解的类,并将它们注册为bean。 例如,以下代码演示了如何在Spring中使用`@ComponentScan`注解扫描名为`com.example`的包下的所有bean定义: ```java @Configuration @ComponentScan("com.example") public class AppConfig { // ... } ``` 除了`@ComponentScan`注解外,还可以使用`@Bean`注解手动注册bean,或者使用XML配置文件来定义bean。 ### 回答2: Spring框架通过Bean扫描机制可以自动检测和加载应用程序中的BeanSpring会在应用程序的类路径上扫描指定的包或类,寻找被Spring管理的Bean。这个过程通常在应用程序启动时发生,Spring会搜索并加载符合条件的类,并将其注册为Bean定义。Spring框架提供了几种方式来配置Bean扫描路径。 首先,可以通过使用@ComponentScan注解来开启Bean的自动扫描。在配置类上加上@ComponentScan注解,并指定需要扫描的包路径,Spring框架将会递归地扫描这些包,查找被@Component、@Service、@Repository、@Controller等注解修饰的类,并将其注册为Bean。 其次,可以使用XML配置文件来进行扫描Bean。在配置文件中使用<context:component-scan>元素,并设置base-package属性为需要扫描的包路径,Spring框架会自动扫描该包下所有被标记的类,并加载注册为Bean。 除此之外,还可以使用基于Java的配置方式,通过编写配置类来定义Bean扫描路径。在配置类上使用@Configuration和@ComponentScan注解,指定需要扫描的包路径,Spring框架会自动搜索并加载满足条件的类。 总之,无论是通过注解还是XML配置文件,Spring框架可以通过不同的方式来扫描Bean,从而实现自动加载和注册。这样可以避免手动配置每个Bean的信息,提高开发效率,使应用程序更加灵活和可扩展。 ### 回答3: Spring框架通过使用不同的机制来扫描和注册bean。 首先,Spring可以通过基于XML的配置文件来扫描bean。在XML配置文件中,我们可以使用`<bean>`元素来定义一个bean,并通过`id`或`name`属性来标识它。通过在`<bean>`元素中配置适当的信息,如类的全限定名、构造函数参数和属性值,Spring可以实例化和管理这些bean。然后,通过在XML配置文件中使用`<context:component-scan>`元素,可以使Spring自动扫描指定路径下的所有带有特定注解的类,并将它们注册为bean。 其次,Spring还可以通过基于注解的方式来扫描bean。通过在类上使用`@Component`注解或其派生注解(如`@Controller`、`@Service`、`@Repository`等),我们可以指示Spring将该类注册为一个bean。同时,通过使用`@Autowired`注解,我们可以将其他依赖的bean自动注入到当前bean中,实现依赖注入的功能。在启动Spring应用程序时,Spring会自动扫描指定路径下的所有类,并将被注解标记的类注册为bean。 最后,Spring还支持自定义扫描和注册bean的机制。我们可以实现`BeanDefinitionRegistryPostProcessor`接口来编写自定义的bean扫描器,通过编程方式将类注册为bean。我们可以根据自己的需求定义扫描路径、过滤条件等,实现更加灵活的bean扫描和注册逻辑。 总结起来,Spring可以通过XML配置文件、基于注解的方式以及自定义扫描器等多种机制来扫描和注册bean,从而实现对应用程序中的组件的管理和控制。这些机制使开发人员能够以更加便捷和灵活的方式管理和使用bean

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值