美文网首页
Spring框架当中的@Configuration、@Bean注

Spring框架当中的@Configuration、@Bean注

作者: 惜小八 | 来源:发表于2020-06-23 00:05 被阅读0次

    转载自:https://mp.weixin.qq.com/s?src=11&timestamp=1592840150&ver=2416&signature=H9gO-29hpeUbnh4QLU7g3IRrno9zqxrFD4YpZJEp4eeUFHSpJuukhAqWb3wkboQOyvhkc-oaZ1itqtcRF11glESG4BjCfiEPdFhuvMkJt7y9VX6baUw-WO2bZKDL&new=1

    前言

    Spring3.0之前要使用Spring必须要有一个xml配置文件,而Spring3.0之后注解慢慢登上舞台,通过注解@Configuration和@Bean可以完全搞定。此时,注解和xml配置形成了相互协作与竞争的关系。随着Springboot的推广,注解的使用在Spring中大放光彩,xml的辉煌一去不返。通过注解,简化了配置,提升了编码效率。

    Spring 3.0新增了另外两个实现类:AnnotationConfigApplicationContext 和 AnnotationConfigWebApplicationContext。它们是为注解而生,直接依赖于注解作为容器配置信息来源的IoC容器初始化类。AnnotationConfigWebApplicationContext是AnnotationConfigApplicationContext的web版本,其用法与后者相比几乎没有什么差别。

    今天这篇文章带大家学习@Configuration和@Bean的使用,并通过具体的实例体验一下注解的方便快捷。如果你的项目中还未曾使用此类注解,说明你的技术栈已经在被淘汰的边缘。

    基于Java类的配置选项

    Spring 3.0引入了注解,配置文件的载体就从xml文件转换为了Java类,Java类就是一个普通的类,除了命名建议以“**Config”结尾方便识别外,Spring对其有一定的约定条件。

    配置类不能是 final 类(没法动态代理)。

    配置类必须是非本地的(即不能将配置类定义在其他类的方法内部,不能是private)。

    配置类必须有一个无参构造函数。

    基本使用方法

    符合上述条件的类,就可以使用@Configuration来进行注解,表示这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解在该类的方法上,AnnotationConfigApplicationContext将配置类中标注了@Bean的方法的返回值识别为Spring Bean,并注册到容器中,归入IoC容器管理。

    @Configuration的作用等价于XML配置中的标签,@Bean的作用等价于XML配置中的标签。下面代码完成了一个简单的示例。
    @Configuration加在类上,@Bean加在有@Configuration注解的类当中的特殊方法上,如果某个对象想要注入IOC容器当中,则将@Bean加在这个方法上,这个方法的返回值是要注入的对象,默认注入名是方法名

    @Configuration
    public class DataSourceConfig{
    
        @Bean
        public MysqlDataSource mysqlDataSource(){
    
            return new MysqlDataSource();
    
        }
    
        @Bean(name ="oracleDataSource")
        public  OracleDataSource oracleDataSource(){
    
            return new OracleDataSource();
    
        }
    
    }
    

    Spring在解析该类时,会识别出标注@Bean的所有方法,执行并将方法的返回值(MysqlDataSource和OracleDataSource对象)注册到IoC容器中。默认情况下,方法名即为Bean的名字。与以上配置等价的XML配置如下:

    <bean id="mysqlDataSource" class="**.MysqlDataSource"/>
     
    <bean id="oracleDataSource" class="**.OracleDataSource"/>
    

    @Configuration的属性

    @Configuration的定义代码:

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

    @Configuration注解本身定义时被@Component标注了,因此本质上来说@Configuration也是一个@Component,只不过我们在具体使用的过程中基本用不到它的实例化对象。

    @Bean属性

    @Bean注解的具体代码定义:

    @Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Bean{
    
        @AliasFor("name")
        String[] value() default{};
        
        @AliasFor("value")
        String[] name() default{};
    
        Autowire autowire() default Autowire.NO;
    
        String initMethod() default "";
    
        String destroyMethod() default "(inferred)";
    
    }
    

    可以看出@Bean具有以下属性:

    name :指定一个或者多个Bean的名字。等价于XML配置中的name属性,示例中的@Bean(name = "oracleDataSource")。
    
    initMethod:容器在初始化完Bean之后,会调用该属性指定的方法。等价于XML配置中的init-method属性。
    
    destroyMethod:该属性与initMethod功能相似,在容器销毁Bean之前,会调用该属性指定的方法。等价于XML配置中的destroy-method属性。
    
    autowire:指定Bean属性的自动装配策略,取值是Autowire类型的三个静态属性。Autowire.BYNAME,Autowire.BYTYPE,Autowire.NO。与XML配置中的autowire属性的取值相比,少了constructor,因为 constructor在这里已经没有意义了。
    
    @Bean默认是单例模式,并且没有提供指定作用域的属性,可以通过@Scope来实现该功能。
    @Bean
    @Scope("prototype")
    public MysqlDataSource mysqlDataSource(){
    
        return new MysqlDataSource();
    
    }
    

    Spring扫描加载

    当配置完Spring扫描指定包及其子包中的类时,会识别所有标记了@Component、@Controller、@Service、@Repository注解的类,由于@Configuration注解本身也用@Component标注了,Spring将能够识别出 @Configuration标注类。

    相关文章

      网友评论

          本文标题:Spring框架当中的@Configuration、@Bean注

          本文链接:https://www.haomeiwen.com/subject/rdmqfktx.html