0
点赞
收藏
分享

微信扫一扫

SpringBoot一些注解(用于仅阶段性学习)

荷一居茶生活 2022-01-26 阅读 73

本文大佬勿看,小白一枚,本文后序会继续更新

@Bean:

给容器添加组件,一般作用在方法上,效果跟在配置文件中写bean标签一样,然后方法名就相当于是id名;

那么在主启动类中,怎么去获取呢?

        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

这样我们得到了所有的bean,然后我们在通过getBean("组件id",实体类.class) 得到组件,并得到返回值;

  Cat cat1 = run.getBean("cat", Cat.class);
        System.out.println(cat1);

@SpringBootApplication:

@SpringBootApplication注解里面有三个核心注解:@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan注解;它一般放在项目的启动类当中,因为SpringBoot是没有xml文件去配置bean的,那么我们如果项目中有xml配置文件,怎么将其注册到容器中呢?,我们可以利用@ImportResource()将配置文件放到启动类这里,然后通过@SpringBootApplication将启动类注入到容器中;

我们来简单分析一下它的三个注解:

@SpringBootConfiguration:用于将bean注入到容器之中,因为该注解下有一个@Configuration,然后@Configuration下又封装了@Component,这就回到Spring那感觉了,@Component的作用不就是将bean注入到容器之中嘛,所以说@SpringBootConfiguration的作用主要肯定还是将bean注册到容器之中啦;注意扫描到的组件必须是同级目录或者比它等级要低,除非你在@SpringBootConfiguration中,加入位置属性比如com.xxx啥的;


//@SpringBootConfiguration的源码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";

    boolean proxyBeanMethods() default true;
}

@Configuration:这里我们可以看到 它有一个是否代理的功能proxyBeanMethods,当为true时,它的作用就是:在同一个配置文件中,调用其他被@Bean标注的方法获取对象会直接从IOC容器中获取,会通过代理的方法从IOC容器中获取,也就是单例,而为false时,它根本不走IOC容器,没有代理,每次调用@Bean,都是新的;

 MyConfig bean = run.getBean(MyConfig.class);
        User user = bean.user();//从配置类对象中获取bean实例user
        System.out.println(user);
        System.out.println(user.getCat()==cat);

@EnableAutoConfiguration:自动配置,老规矩,先看它的源码(好多),看有没有啥我们能看的懂的,首先你可以看到@Import(EnableAutoConfigurationImportSelector.class),它的作用是啥?是将符合条件的@Configuration配置加载到springboot中创建,并且使用IOC容器,

@ComponentScan:它有两个作用,组件扫描和自动装配;

@ConditionalOnMissingBean(name="xxx"):就是条件注解,这个注解类上和方法上都可以放置,如果不符合该条件,那么In下面的组件将不会被注册;

@Import:可以引入普通的类帮助我们将普通的类定义为Bean,而@Import可以添加到启动类@SpringBootApplication,@Configuration配置类,@Component组件上,将@Import的类注册到IOC容器中;

@SpringBootApplication
@Import(Fairy.class) // 通过@Import注解把Fairy添加到IOC容器里面去
public class MyBatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyBatisApplication.class, args);
    }

}

 当我们的bean注册到容器之后,我们可以在Controller层,将这个bean注入,当访问url时,出现对应的json字符串;

@RestController
public class HelloController {

//    在controller下验证是否import成功
    @Autowired
    Fairy fairy;
    @RequestMapping("/fairy")
    public Fairy getFairy(){
        return fairy;//这里目测成功
    }
}

然后对应的实体类也应该注意+@ConfigurationProperties(prefix="xxx"):意思是在application.properties:前缀以xxx.属性名进行配置;

fairy.name=Fairy
fairy.age=19
fairy.ability=big
举报

相关推荐

0 条评论