一、 Spring的三种注入方式

1、构造器注入
2、setter注入
3、注解(@Autowired、@Resource、@Qualifier )

二、为什么要用自动注入?

因为在bean很多或者自定义的类很多的情况下,就需要在xml文件中一直写bean并且还要将每一个属性set(构造方法)入参的方式引入bean里面,这样的耦合性变高,后期也不容易进行维护

三、类属性注入到Spring容器中有几种方式?

@Autowired 按类型注入 Spring自己的注解,是自动注入,自动从spring的上下文找到合适的bean来注入
@Resource用来指定Bean名称注入,javaEE的,Spring也支持,建议使用整个,全球通用的
@Qualifier (和Autowired配合使用,指定bean的名称)

四、Bean容器的相关注解?

1、@Autowired

@Autowired
顾名思义,就是自动装配,其作用就是为了消除代码java代码里面的getter/setter与bean属性中的property.
@Autowired
默认按类型匹配的方式,当Spring发现@Autowired注解时,就自动在代码上下文中找到其匹配的Bean,当仅有一个匹配的Bean时,Spring将其注入@Autowire标注的变量中。

2、@Qualifier(指定Bean名称注入)

@Qualifier 就是 autowire=byName, @Qualifier
通常和@Autowired一起使用,一般在两个或者多个bean是相同的类型时,spring注入会出现混乱,就需要使用
@Qualifier(“xxBean”) 来指定Bean的名称。

  • 例如
    定义一个Car接口,两个实现类BMWCar和BenzCar:
    再写一个CarFactory,引用car(这里先不用@Qualifier注解):
    Car接口有两个实现类,Spring并不知道应当引用哪个实现类。

通常有两种解决办法:

(1) 在配置文件中删除其中一个实现类,Spring会自动去base-package下寻找Car接口的实现类,发现Car接口只有一个实现类,便会直接引用这个实现类。
(2) 实现类就是有多个该怎么办?此时可以使用@Qualifier注解来指定Bean的名称

@Autowired
@Qualifier("bmwCar")
private ICar car;

此处会注入名为"bmwCar"的Bean。

3. @Resource


@Resource(name="tiger")
private Tiger tiger;

@Resource(type=Monkey.class)
private Monkey monkey;

@Resource的装配顺序:

(1) @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配 (2)
指定了name或者type则根据指定的类型去匹配bean (3)
指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

@Resource 与 @Autowired 的区别:

(1) @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
(2) @Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了,Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐