【源码解析】Spring常用组件

举报
小明的混沌之路 发表于 2022/07/31 15:18:42 2022/07/31
【摘要】 Spring常用组件

前言:📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫 

🏆 Java领域优质创作者、阿里云专家博主、华为云专家🏆

🔥 如果此文还不错的话,还请👍关注点赞收藏三连支持👍一下博主哦

 @ComponentScan

@ComponentScan(扫描规则)作用:指定要扫描的包
用例:
一、表示扫描此目录下的包

@ComponentScan(value="com.enjoy.cap2")

二、在Cap2MainConfig2加入配置: value: 指定要扫描的包,@Filter: 扫描规则,excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件,includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件,useDefaultFilters = false 默认是true,扫描所有组件,要改成false

@ComponentScan(value="com.enjoy.cap2",includeFilters={    
      @Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
      @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class})
},useDefaultFilters=false) //默认是true,扫描所有组件,要改成false,使用自定义扫描范围

//FilterType.ANNOTATION:按照注解
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
//FilterType.ASPECTJ:使用ASPECTJ表达式
//FilterType.REGEX:使用正则指定
//FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口

@Import注册bean

@Conditional条件注册bean

当IOC容器注册bean, 当操作系统为WINDOWS,注册Lison实例; 当操作系统为LINUX, 注册James实例,此时要用得@Conditional注解进行定制化条件选择注册bean;

@Bean

@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名

@Configuration

@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@Service、@Controller、@Repository

将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。

@Primary

当一个接口有2个不同实现时,使用@Autowired注解时会org.springframework.beans.factory.NoUniqueBeanDefinitionException异常信息, @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 
详解:

public interface Animal {
    String eat(String food);
}

@Component // 加注解,让spring识别
public class Dog implements Animal {
    @Override
    public String eat(String food) {
        return "狗吃 "+food;
    }
}
public class Cat implements Animal  {
    @Override
    public String eat(String lyrics) {
        return "猫吃"+food;
    }
}
// 只能找到狗
@Component
public class AnimalService {
   @Autowired
   private Animal animal;
   public String eat(){
       return animal.eat("骨头:Σ=3");
   }
}

// 现在优先给猫
// @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 
@Primary
@Component
public class Cat implements Animal {
    @Override
    public String eat(String food) {
        return "猫吃"+food;
    }
}

@Lazy

lazy懒加载,只有获取bean是才会加载到IOC容器中

@Configuration
public class LazyMainConfig {
    /**
     * 给容器注册一个bean,类型为返回值类型,默认是单实例
     * 懒加载:主要针对单实例bean,默认在容器启动的时候创建对象
     * 懒加载:容器启动时不创建对象,仅当第一次使用(获取)bean的时候才创建被初始化
     */
    @Lazy
    @Bean
    public Person person () {
        // 在bean对象创建前打印
        System.out.println("给容器中添加person");
        return new Person("fmc",21);
    }
}

@Scope

prototype: 多实例:IOC容器启动并不会去调用方法创建对象放在容器中,而是每次获取的时候才会调用方法创建对象
singleton: 单实例(默认):IOC容器启动会调用方法创建对象放到IOC容器中,以后每交获取就是直接从容器(理解成从map.get对象)中拿 
request:
  主要针对WEB应用,同一次请求创建一个实例
session:
  同一个session创建一个实例

@Scope("prototype")
@Bean
public Person person(){
    return new Persion("james",20);
}



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。