Spring依赖注入

Spring两大特性:IOC控制反转、AOP面向切面编程。

  • IOC:控制反转,把创建对象的过程交给 Spring 进行管理(DI:依赖注入,在IoC容器内将有依赖关系的bean进行关系绑定。成员变量有两种注入方式:set注入、构造方法注入)。
  • AOP:面向切面编程,在不动源代码的基础上对代码进行增强。他利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect”,即切面,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并利用于未来的可操作性和可维护性。
  • aop使用场景:如权限认证、日志、事务等等

在项目中,注入spring容器中bean对象时,均可使用@Resource。

目前IDEA不推荐使用@Autowried,原因:@Autowried是spring提供的,并非是Java标准,而@Resource是Java标准定义的,推荐使用。

如果想使用@Autowried的话,建议通过构造器注入(成员字段上用final修饰不需要加注解,类上添加@RequiredArgsConstructor注解)。

Spring依赖注入_第1张图片


Spring的三种注入方式


  • 在Spring中,默认情况下,bean的注入方式是使用构造器注入(Constructor Injection)。意味着,当Spring创建新的bean实例时,它会调用一个构造函数,并将依赖关系作为参数传递给该构造函数。

  • 虽然构造函数注入是默认的首选方式,但Spring也允许使用Setter方法注入或字段注入,具体取决于您的需求和项目的配置。如果构造函数不存在或未标记为@Autowired,则会尝试使用Setter方法注入或字段注入方式。

方式1:字段注入(在初始化bean时,底层通过反射为属性赋值)

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
}

方式2:构造函数注入

  • 构造函数注入可以保证重要属性预先设置
  • 无需提供每个属性的setter方法,减少类的方法个数
  • 可以更好地封装类的变量,避免外部错误调用
@Service
public class UserService {
    private final UserMapper userMapper;

    @Autowired
    public UserService(UserMapper userMappe) {
        this.userMappe = userMappe;
    }
}

简化写法:

@Service
@RequiredArgsConstructor //lombok提供
public class UserService {
    private final UserMapper userMapper;
}

方式3:setter方式注入

@Service
public class UserService {
    private UserMapper userMapper;

    @Autowired
    public void setRepository( UserMapper userMapper) {
       this.userMappe = userMappe;
    }
}

@Autowried和@Resource的区别


  • @Autowired和@Resource都是用来进行依赖注入的。
  • @Autowired:默认按照类型注入,如果一个类型下有多个bean就会报错,可以借助@Qualifier指定bean的名字注入。@Autowired注解可以对构造器、方法、参数、字段使用。
  • @Resource:默认按照bean的名子找,如果找不到则按照bean的类型找,找到就直接注入,找到多个则会报错。可以给@Resource注解配置name属性,只会找叫这个名字的Bean对象。@Resource注解只能对方法、字段使用,不能用于构造器。
  • @Autowired是Spring提供的(spring环境才能使用),@Resource是SR-250提供的。
  • 基本上@Resource可以完全替代@Autowired。
  • 扩展:还有一个@Inject注解,它和@Autowired注解的工作原理是一样的,不过它也是JDK层面提供的

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