一、注解的分类
主要分为两大类:使用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容器中,相当于配置文件中的
我们就可以使用@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等。
当然还有很多很多注解,大家去发现一下吧。