@Component是一个元注解,可以注解其他类注解。@Configuration注解里面也是被@Component注解修饰的。
bean设置的类属性不同。
full模式使用特性:
full模式下的配置类会被CGLIB代理生成代理类取代原始类型(在容器中)
full模式下的@Bean方法不能是private和final
单例scope下不同@Bean方法可以互相引用,达到单实例的语义
lite模式使用特性:
lite模式下的配置类不生成代理,原始类型进入容器
lite模式下的@Bean方法可以是private和final
单例scope下不同@Bean方法引用时无法做到单例
返回bean实例不同。
@Bean注解在@Configuration类中声明,称之为“full”模式;当@Bean注解和@Component注解组合使用时,称之为“lite”模式;
如果只是把@Bean注解用在方法上,并且各个@Bean注解的方法之间没有调用,上述两种模式达到的效果基本相同,都可以把@Bean注解方法返回的对象作为bean注册到容器中。
如果各个@Bean注解的方法之间有相互调用,那么两种模式就会有很大的区别-与full模式下的@Configuration不同,lite模式下 @Bean方法互相调用无法声明Bean之间的依赖关系。

1、@Autowire是Spring提供的,@Resource是J2EE提供的;
2、@Autowire 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false。
想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired() @Qualifier(“baseDao”)
private BaseDao baseDao;
3、@Resource 默认按名称装配,当找不到与名称匹配的 bean 时才按照类型进行装配。名称可以通过 name 属性指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名,当注解写在 setter 方法上时,默认取属性名进行装配。
推荐使用:@Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。
| @Primary | 优先注入该注解的标注的bean |
| @Qualifier | 确定注入该注解标定的bean |
@Qualifier 该注解的意思是直接注入该注解标定的bean,而非选择。
- public interface IA {
- String getName();
- }
-
- @Component
- public class A1 implements IA {
- public String getName() {
- return "A1";
- }
- }
-
- @Component
- public class A2 implements IA {
- public String getName() {
- return "A2";
- }
- }
-
- @Component
- public class A3 implements IA {
- public String getName() {
- return "A3";
- }
- }
-
- public class ClassRoom {
- @Autowired
- @Qualifier("a1")//不加这个就会报错:NoUniqueBeanDefinitionException
- public IA iA;
- }
@Qualifier是在使用注入的时候,使用方明确指出使用哪个;@Primary更像是提供方告诉你优先使用哪个;
- public interface IA {
- String getName();
- }
-
- @Component
- @Primary //不知道加载哪个的时候,默认加载A1的
- public class A1 implements IA {
- public String getName() {
- return "A1";
- }
- }
-
-
- @Component
- public class A2 implements IA {
- public String getName() {
- return "A2";
- }
- }
-
-
- @Component
- public class A3 implements IA {
- public String getName() {
- return "A3";
- }
- }
-
- public class MySort {
- @Autowired
- public IA iA;
- }
值得注意的是,@Qualifier注解配合@Autowired注解一起使用,@Primary注解配合@Bean或者@Component注解一起使用,如果 @Qualifier 和 @Primary 注释都存在,那么 @Qualifier 注释将具有优先权,基本上,@Primary 是定义了默认值,而 @Qualifier 则非常具体。