当前位置: 首页 > 知识库问答 >
问题:

@ComponentScan和@Component背后的魔力

鲁华茂
2023-03-14

我仍在深入学习Spring依赖注入。

我的第一个类是配置类,在这里我向容器声明以加载和管理在带注释的方法中声明的bean。

package ioc.question_004;

import ioc.commun.Person;
import ioc.commun.Profession;
import org.springframework.context.annotation.*;

@Configuration
public class MyConfiguration {

    @Bean
    public Profession profession(){
        return Profession.builder()
                     .name("professor")
                     .description("professor in the university")
                     .build();
    }

    @Bean
    public Person person(){
        return Person.builder()
                     .name("Bagna")
                     .age(52)
                     .profession(profession())
                     .build();
    }

}

我的第二个类是一个daoRepository,它看起来像:

package ioc.question_008.dao;

import ioc.commun.Person;
import lombok.*;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

@Repository
@Builder
@Setter
@Getter
@EqualsAndHashCode
@ToString
public class MyDaoRepository implements dao {

    List<Person> personList = new ArrayList<>();

    @Override
    public boolean save( Person person ){
        return this.personList.add(person);
    }

    @Override
    public boolean delete( Person person ){
        return  this.personList.remove(person);
    }

}

我的运行代码如下:

@Configuration
@Import(MyConfiguration.class)
@ComponentScan(basePackageClasses = {MyDaoRepository.class} )
public class DependencyInjection {
    public static void main( String[] args ) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DependencyInjection.class);
        dao myDaoRepository = (MyDaoRepository) context.getBean("myDaoRepository");
        System.out.println(myDaoRepository);
    }

}

神奇的是,MyDaoRepository包含在配置类MyConfiguration中声明的@Bean person:

MyDaoRepository(personList=[个人(姓名=Bagna,年龄=52,专业=专业(姓名=教授,描述=大学教授))])

我认为容器自动注入了这个对象,即使我没有要求这样做。可能是编译器添加了一些@Autow的注释。我不确定。

请您向我解释一下,我如何要求spring容器不要注入bean,即使它们存在于容器中(例如bean人),除非我要求自己使用@Autowired注释进行注入。

共有1个答案

步兴德
2023-03-14

原因是spring的集合自动布线和lombok的构建器相结合

首先,构建器添加了一个all-args构造函数MyDaoRepository(列表

其次,spring会自动检测工厂方法@Bean public Person()。

现在,由于构造函数需要一个集合,spring将它可以找到的所有bean累加到列表中,并将其注入构造函数中,相应地设置列表。

我认为(但目前尚未测试,但这里有文档记录),将自动连线(required=false)添加到您的列表中

编辑:正如冷冻豌豆的Roddy先生所指出的,也可以为spring添加一个不同的构造函数来创建bean,例如,通过使用noargsconstuctor注释您的存储库

 类似资料:
  • 问题内容: 我有一个要从特定对象中排除的组件: 否则,它似乎与我项目中的其他班级发生冲突。我不完全理解碰撞,但是如果注释掉注释,事情就会像我希望的那样工作。但是其他依赖于此库的项目希望此类由Spring管理,因此我只想在我的项目中跳过它。 我尝试使用: 但它似乎不起作用。如果尝试使用,则会收到一个奇怪的错误,提示你无法加载一些看似随机的类: 原因:java.io.FileNotFoundExcep

  • 我想从特定中的中排除一个组件: 否则,它似乎会与我项目中的其他类发生冲突。我并不完全理解这种冲突,但是如果我注释掉< code>@Component注释,事情就会如我所愿地运行。但是其他依赖这个库的项目期望这个类由Spring管理,所以我只想在我的项目中跳过它。 我尝试使用< code>@ComponentScan。过滤器: 但是它似乎不起作用。如果我尝试使用,我会收到一个奇怪的错误,因为无法加载

  • 我一直四处寻找,但无法为以下情况找到明确的解决方案: 我们有一个web应用程序(Grails+Spring Security),它在Apache后面的tomcat中运行。应用程序的一部分需要在https上运行,因此使用Spring Security Channel Security,只要您导航到应用程序的一部分是安全的,Spring就会将您重定向到https,状态代码为302。 现在问题出现在将a

  • 我在试着理解这里的区别。我看到一个类已经用它们两个相同的包示例进行了注释: 我理解与API文档的区别,但想详细了解。这是否意味着扫描的任何内容都具有更广泛的wrt Spring上下文可见性,而则没有。如果是这样的话,在中使用一些属性就足以满足在JPA上下文中绑定的需要了,不是吗?

  • 本文向大家介绍Spring @Configuration和@Component的区别,包括了Spring @Configuration和@Component的区别的使用技巧和注意事项,需要的朋友参考一下 Spring @Configuration 和 @Component 区别 一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同

  • 此绑定用于将组件插入DOM元素并可选地传递参数。 这种绑定可以通过以下两种方式实现 - Shorthand Syntax Full syntax 速记语法 在此方法中,仅指定组件名称而不指定任何参数。 Syntax <div data-bind = 'component: "component-name"'></div> 传递的参数值可以是可观察的。 因此,每当可观察的更改时,将丢弃旧的组件实例