美文网首页Spring
Spring 常用注解

Spring 常用注解

作者: 沈先生的影子 | 来源:发表于2020-11-07 13:33 被阅读0次

    一、注解的分类

       主要分为两大类:使用Bean注解、注册Bean注解。

    使用Bean的注解

       @Autowired 、 @Resource

    @Autowired

      可以对类的成员变量、方法、构造函数等进行标注,DI会自动完成装配工作,可以通过@Autowired来消除get、set方法。

      @Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用)如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualifier注解进行限定,指定注入的bean名称。

    例子

    
        @Component("fooFormatter")
        public class FooFormatter implements Formatter {
            public String format() {
                return "foo";
            }
        }
    
        @Component("barFormatter")
        public class BarFormatter implements Formatter {
            public String format() {
                return "bar";
            }
        }
    // 使用----------------------------------------------------
        @Component
        public class FooService {
            @Autowired
            private Formatter formatter;
            
            //todo 
        }
    
    
    使用 @Qualifier
        @Component
        public class FooService {
            @Autowired
            @Qualifier("fooFormatter")
            private Formatter formatter;
            
            //todo 
        }
    
    

      如果我们尝试将 FooService 加载到我们的上下文中,Spring 框架将抛出 NoUniqueBeanDefinitionException。这是因为 Spring 不知道要注入哪个 bean。为了避免这个问题,有几种解决方案。那么我们本文要讲解的 @Qualifier 注解就是其中之一。

      通过使用 @Qualifier 注解,我们可以消除需要注入哪个 bean 的问题。

    @Resource

      @Resource注解和@Autowired注解都是进行依赖注入的注解。@Resource注解是byName注入,@Autowired注解是byType注入。

    @Resource依赖注入时查找bean的规则:

      1.既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。

      2.只指定了name属性,按照byName的方式注入,如果找到与之相匹配的bean就返回注入,没有找到就报错。

      3.只指定了type属性,就从上下文去找到匹配的类型,如果找到就返回,没有找到就报错。

      4.name属性type属性,两者都指定 ,会从bean工厂的上下文找到唯一匹配的对象返回,如果没有找到就报错。

    还有很多的其他的注解, 就不一一详细介绍了。

    注册Bean的注解

      @Component、@ ComponentScan、@Repository、@Controller、@Service、@Configration、

    @Component

      用法是pojo实例化到spring容器中,相当于配置文件中的
    <bean id="" class=""/>泛指各种组件,就是说当我们的类不属于其他归类的时候(不属于@Controller、@Services等的时候),
    我们就可以使用@Component来标注这个类。
    其实@Controller、@Services 也是继承了 @Component,在Spring层面他们之间是没有任何区别的,只是用于归类罢了。

    @ComponentScan

      用于告诉Spring那些包路径下的类是需要被Spring扫描装入IOC容器的。

    例如,如果你有个类用@Controller注解标识了,如果不在@ComponentScan配置的包路径下,那么该Controller就不会被Spring扫描到,更不会装入Spring容器中。

    @Repository

      用于标注数据访问组件,即DAO组件。@Repository和@Mapper用法是一样的。

      @Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中。

      @Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。

    @Controller

      当组件属于控制层时,则使用@Controller注解。将Controller注册到实例化到SpringIOC容器中。用来创建处理http请求的对象。

    @Service

      当组件属于业务层时,则使用@Service,同理注册和实例化到SpringIOC容器中。

    @Configuration

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

    需要注意的是:

    @Configuration不可以是final类型;

    @Configuration不可以是匿名类;

    嵌套的configuration必须是静态类。

    小结

      Bean注解主要用于接口和方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解,譬如用@Qualifier注解定义工厂方法的名称,用@Scope注解定义该bean的作用域范围,譬如是singleton还是prototype等。

    当然还有很多很多注解,大家去发现一下吧。

    相关文章

      网友评论

        本文标题:Spring 常用注解

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