Spring 常用注解

一、注解的分类

   主要分为两大类:使用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容器中,相当于配置文件中的
泛指各种组件,就是说当我们的类不属于其他归类的时候(不属于@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 常用注解)