了解几个注解

232 阅读3分钟

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战 SpringBoot的快速入门,基本就差不多,但是我们要是想把一个东西学好,怎么去用它仅仅是不够的,我们还要去更深层次地去了解,才能更好的去使用,先从几个注解说起。

@Configuration

之前我们配置Spring的时候使用的是配置文件,这个标签是可以使用配置类的方式来配置我们的文件,实体类就没有什么好说的了。

@Configuration
public class MyConfig {

    /**
     * 给容器中添加组件。以方法名作为组件ID。
     * 返回值类型就是组件类型
     * 返回的值,就是组件在容器中的实例
     */
    @Bean
    public User user01(){
        return new User("张三",18);
    }
    @Bean
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

在我们的启动类中写下如下代码,让我们看一看组件是否相同

 public static void main(String[] args) {
        //1、返回我们的IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(SpringBootWebApplication.class, args);
        //2、查看IOC容器里的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names){
            System.out.println(name);
        }
        //3、从容器中获取组件
        Pet tom = run.getBean("tom", Pet.class);
        Pet tom1 = run.getBean("tom", Pet.class);
        System.out.println("组件:"+(tom==tom1));

    }

这是我们刚刚添加的组件

也像是出我们组件是相同的

配置类里面使用@Bean的方式标注在方法上给容器注册组件,默认也是单实例了,我们的配置类也算是组件

在Spring5.2之后他多了一个函数

proxyBeanMethods: 代理bean方法

因为我们在我们的配置类注册了组件,那我们提出配置类中的bean,去调用类中的方法,那他是简单的调用的方法,还是从容器中提取呢?

我们编写如下测试代码

		MyConfig bean =run.getBean(MyConfig.class);
        System.out.println(bean);
        User user =bean.user01();
        User user1 = bean.user01();
        System.out.println(user==user1);

外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象

因为本身配置类就是一个被增强的类,他是被代理的,代理对象调用方法,我们这个属性就会在容器中寻找之前用没有被注册过,没有才会去创建。

如果这个属性是fales,那我们调用时,得到的就不是一个。

如果我们在注册组件时不是像相互依赖的,我们就可以调成false,我们的启动过程是十分快的

@Import

我们可以通过这个注解导入组件@Import({User.class, DBHelper.class})给容器中自动创建出这两个组件,默认主键的名就是全类名

测试代码就不贴了

@Conditional

符合条件则加载该bean,不符合则不加载该bean

就拿我们刚刚例子,我们的用户是依赖我们的宠物的,如果我们的容器中没有宠物的这个组件,我们就不需要注册用户这个组件

		boolean tom=run.containsBean("tom");
        System.out.println("容器中Tom组件"+tom);
        boolean user01=run.containsBean("user01");
        System.out.println("容器中User组件"+user01);

我们这个也可以标注在类上,作用的范围也会扩大到类

@ConditionalOnMissingBean这个标签与@ConditionalOnBean是相反的

@ImportResource

这个标签是用来导入资源文件的,在一些老的项目中,还是使用配置文件的方式来配置的,我们如果,都把他迁移过来,是十分麻烦的,

@ImportResource("classpath:beans.xml")的方式就可以将原来的资源文件导入进来

@ConfigurationProperties

配置绑定,使用Java读取properties文件中的内容,并把它封装到JavaBean中

另一种方式

@EnableConfigurationProperties(Car.class)

开启了Car配置绑定功能

把我们Car这个组件自动注册到容器中