Spring的注解总结

1.@Component  @Configuration

    @Component是一个元注解,可以注解其他类注解。@Configuration注解里面也是被@Component注解修饰的。

   bean设置的类属性不同。

  • 如果是 @Configuration 并且属性 proxyBeanMethods 为 true(默认的),则为 full
  • 如果是 @Component @ComponentScan @Import @ImportSource 则为 lite,被@Configuration修饰,但是属性proxyBeanMethods = false

full模式使用特性:

full模式下的配置类会被CGLIB代理生成代理类取代原始类型(在容器中)
full模式下的@Bean方法不能是private和final
单例scope下不同@Bean方法可以互相引用,达到单实例的语义
 

lite模式使用特性:

lite模式下的配置类不生成代理,原始类型进入容器
lite模式下的@Bean方法可以是private和final
单例scope下不同@Bean方法引用时无法做到单例

返回bean实例不同。

  • @Configuration 注解修饰的类,并且该注解中的 proxyBeanMethods 属性的值为 true(默认的),则会使用cglib动态代理,为这个 bean 创建一个代理类,该代理类会拦截所有被 @Bean 修饰的方法,在拦截的方法逻辑中,会从容器中返回所需要的单例对象。
  • @Component 注解修饰的类,则不会为这个 bean 创建一个代理类。 那么我们就会直接执行用户的方法,所以每次都会返回一个新的对象

@Bean注解在@Configuration类中声明,称之为“full”模式;当@Bean注解和@Component注解组合使用时,称之为“lite”模式;

如果只是把@Bean注解用在方法上,并且各个@Bean注解的方法之间没有调用,上述两种模式达到的效果基本相同,都可以把@Bean注解方法返回的对象作为bean注册到容器中。

如果各个@Bean注解的方法之间有相互调用,那么两种模式就会有很大的区别-与full模式下的@Configuration不同,lite模式下 @Bean方法互相调用无法声明Bean之间的依赖关系。

Spring的注解总结_第1张图片

2.@Autowire @Resource

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的耦合。最重要的这样代码看起就比较优雅。

3.@Qualifier @Primary

@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 则非常具体。

你可能感兴趣的:(Java,spring,java)