DI - Official Documents

@Autowired

@Autowired - Official Documents
构造器注入,只有一个构造函数的时候@Autowired可省略

As of Spring Framework 4.3, an @Autowired annotation on such a constructor is no longer necessary if the target bean only defines one constructor to begin with. However, if several constructors are available, at least one must be annotated to teach the container which one to use.

只因多看了一眼提示,又一次刷新了@Autowired注释的认知

1、构造器注入适用具有强依赖和不变性的依赖; 2、Setter注入适用于具有可选性和可变性的依赖注入; 3、Field注入,尽量少使用,如果需要则使用@Resource进行替代,以降低耦合性。

构造器注入

  1. @SpringBootTest
  2. public class SimpleTest {
  3. private final Svc svc;
  4. // 省略了@Autowired
  5. public SimpleTest(@Qualifier(value = "svcB") Svc svc) {
  6. this.svc = svc;
  7. }
  8. @Test
  9. void rc() {
  10. svc.sayHello();
  11. }
  12. }

Setter注入

  1. @SpringBootTest
  2. public class SimpleTest {
  3. private Svc svc;
  4. // 不能省略@Autowired
  5. @Autowired
  6. public void setSvc(@Qualifier(value = "svcB") Svc svc) {
  7. this.svc = svc;
  8. }
  9. @Test
  10. void rc() {
  11. svc.sayHello();
  12. }
  13. }
  1. // Setter注入例子,有可选性和可变现
  2. @Service
  3. public class ActivityService extends EntityManager<UserActivity, Long> {
  4. private HibernateDao<UserActivityType, Long> userActivityTypeDao;
  5. private HibernateDao<ActivityRewardRecord, Long> activityRewardRecordDao;
  6. @Autowired
  7. public void setDao(final SessionFactory sessionFactory) {
  8. userActivityTypeDao = new HibernateDao<UserActivityType, Long>(sessionFactory, UserActivityType.class);
  9. activityRewardRecordDao = new HibernateDao<ActivityRewardRecord, Long>(sessionFactory, ActivityRewardRecord.class);
  10. }
  11. }

一个对象,其依赖能被 spring自动注入,一定是该对象本身是被spring管理的,否则不可能被凭空注入。xml配置或者加诸如@Component注解都可以。 —— 待解决:只加@Component还有点问题。

建议构造器注入

Field injection is not recommended(不再推荐使用字段注入)

循环依赖问题

Jpa对象关联,打印toString出现循环依赖

@Condional条件注解

use case:

  1. certain beans don’t work in a test environment
  2. to enable or disable a certain cross-cutting concern(configures security)
  3. load certain beans only if some external resource is available