• Spring注入和生命周期


    目录

    获取Bean对象(对象装配)

    属性注入

    构造注入

    Setter注入 

     三种注入的优缺点分析

    注入的注解: 

    一个类型多个bean对象的注入方式

    1.让变量名等于bean的id 

    2.用Resource注解(name=“bean的id”)

    3.用Qualifier注解(“bean的id”) 

    Bean的作用域 

    作用域的概念:

    Bean的六种作用域

    Bean的生命周期


    获取Bean对象(对象装配)

    获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入

    对象装配(对象注入)的方式有以下三种:

    • 属性注入
    • 构造方法注入
    • Setter注入

    属性注入

    属性注入是使用 @Autowired 实现的,将 Service 类注入到 Controller 类中。

    一般是Controller写一个方法(处理http请求),调用service的业务方法(处理业务逻辑),再调用repository的方法(处理数据库的CRUD操作

    1. //Controller类
    2. @Controller
    3. @Data //lombok注解
    4. public class UserController {
    5. @Autowired
    6. private UserService userService;
    7. }
    8. //Service类
    9. @Service
    10. @Data
    11. public class UserService {
    12. @Autowired
    13. private UserRepository userRepository;
    14. }

    构造注入

    1. // 构造注入
    2. @Autowired
    3. public UserService(UserRepository userRepository) {
    4. this.userRepository = userRepository;
    5. }
    6. private UserRepository getUserRepository(){
    7. return userRepository;
    8. }

    注意事项:如果类只有一个构造方法,那么 @Autowired 注解可以省略;如果类中有多个构造方法,那么需要添加上 @Autowired 来明确指定到底使用哪个构造方法。

    Setter注入 

    1. @Autowired
    2. public void setUserRepository(UserRepository userRepository) {
    3. this.userRepository = userRepository;
    4. }

     三种注入的优缺点分析

    属性注入:

    优点:简洁,使用方便  缺点:只能用于loC容器

    构造注入:

    优点:通用性  缺点:有多个注入的时候会比较臃肿

    Setter注入:

    现在几乎不使用了,通用性不如构造注入,也比较臃肿

    注入的注解: 

    @Autowirte、@Resource 实现的效果是一样的

    区别:@Autowirte是Spring框架提供的,@Resource是JDK提供的

    一个类型多个bean对象的注入方式

    当一个类型有多个bean对象时,该如何注入?

    1. @Bean
    2. public Bean对象1 test_1(){
    3. Bean对象1 bean=new Bean对象1();
    4. bean.setName("hello");
    5. return bean;
    6. }
    7. @Bean
    8. public Bean对象1 test_2(){
    9. Bean对象1 bean=new Bean对象1();
    10. bean.setName("word");
    11. return bean;
    12. }

    当出现多个Bean注解,返回同一对象类型是程序会报错

    解决的方式有三种:

    1.让变量名等于bean的id 

    1. @Autowired
    2. private Bean对象1 test_1;

    2.用Resource注解(name=“bean的id”)

    1. 第二种:用@Resource注解
    2. @Resource(name = "test_1")
    3. private Bean对象1 bean对象1;

    3.用Qualifier注解(“bean的id”) 

    1. @Autowired
    2. @Qualifier("test_2")
    3. private Bean对象1 bean对象1;

    Bean的作用域 

    假设现在有一个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的途中 A 用户却“悄悄”地修改了公共 Bean 的数据,导致 B 用户在使用时发生了预期之外的逻辑错误。

    作用域的概念:

    Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式,比如 singleton 单例作用域(默认),就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,那么当其他人修改了这个值之后,那么另一个人读取到的就是被修改的值。

    Bean的六种作用域

    1. singleton:单例作用域 (Spring默认的作用域)

    2. prototype:原型作用域(多例作用域)

    3. request:请求作用域(一次请求响应范围)

    4. session:回话作用域(一个会话的范围)

    5. application:全局作用域

    6. websocket:HTTP WebSocket 作用域

    (注意:后4种状态是Spring MVC中的值,在普通Spring项目中只有前两种)
     

    Bean的生命周期

    Bean 的生命周期分为以下 5 大部分:
    1.实例化 Bean(为 Bean 分配内存空间)
    2.设置属性(Bean 注入和装配)
    3.Bean 初始化
    实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、
    ApplicationContextAware 的接口方法;
    执行 BeanPostProcessor 初始化前置方法;(XXXbedoreXXX)
    执行 @PostConstruct 初始化方法,依赖注入操作之后被执行;
    执行自己指定的 init-method 方法(如果有指定的话);
    执行 BeanPostProcessor 初始化后置方法。(XXXafterXXX)
    4.使用 Bean
    5.销毁 Bean
    销毁容器的各种方法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。

  • 相关阅读:
    基于yolov5的车辆行人道路检测
    《Linux-常见指令详解》
    win10 + chrome 死机
    vue-cli自定义创建项目-eslint依赖冲突解决方式
    SpringBoot 集成 JMS 与 IBMMQ 代码示例教程
    Android自动化测试中使用ADB进行网络状态管理!
    前端例程20220729:按钮悬停边框卷动效果
    【Latex】模板设置及使用教程
    Java之多线程
    开发一个接口,需要考虑什么
  • 原文地址:https://blog.csdn.net/m0_61801103/article/details/127717229