控制反转(Ioc)和依赖注入(DI)

本文介绍了Spring和SpringBoot的基本概念和作用,详细讲解了控制反转(IoC)原理,包括如何通过注解加载和获取Bean,以及Bean的作用范围。此外,还探讨了依赖注入(DI)的应用,@Autowired和@Qualifier的使用。同时,提到了SpringBoot对Junit的整合,以及Lombok工具包的常用注解。最后,讨论了Spring的循环依赖问题及其解决方案。
摘要由CSDN通过智能技术生成

一、Spring和SpringBoot简介
Spring简介【总】
概念:是一个java技术框架,简化了企业开发的难度和开发周期。
作用:1、分层解耦。2、简化框架的使用难度。
SpringBoot简介【总】
概念:基于Spring的框架。
作用:简化了Spring框架开发的难度(省去了Spring的很多配置)
二、控制反转(Ioc)
IoC概念【总】
控制反转:将创建Bean对象的权利交给Spring,Spring创建Bean对象之后保存到Spring容器中,我们程序从Spring容器中获取需要的Bean对象就行了。
注解作用:告诉Spring创建Bean对象
1、加载Bean
@Component:写类上,将普通类交给Spring管理,这个类非三层架构中的类。
@Controller:写类上,把controller层类交给Spring管理(学习SpringMVC会用到)

//控制层注解,
@Controller
public class UserController {
    //@Qualifier("userServiceImplA")
    @Autowired
  //通过spring容器给变量赋予对应的值
    private UserService userService;

    public void add() {
        System.out.println("UserController");
        userService.off();
    }
}

@Service:写类上,把service层类交给Spring管理。

@Service("userServiceImplA")
public class UserServiceImplA implements UserService {
    @Override
    public void off() {
        System.out.println("A实现类执行了");
    }
}

@Repository:写类上,把dao层类交给Spring管理。(但是现在很少用,因为dao层使用的是mybatis技术,没有类只有接口)
注意:Spring默认加载引导类所在包及其子包下面的类上的注解,如果我们的类不在这个包范围内,无法被加载。可以在引导类上使用@ComponentScan(“…”)注解指定要扫描的包。

2、获取bean

//PersonServiceImpl是PersonService的实现类,要获取spring容器中哪个类的对象,就再类名后加。calss,如果是接口,并且有多个实现类,那么就需要具体的实现类的类名
        PersonService personService = run.getBean("PersonServiceImpl", PersonService.class);

3、Bean的范围
@Scope(“”):
使用位置:写在类上
作用:指定Bean的作用范围。singleton表示单例bean,默认值。prototype表示多例bean。
4、管理第三方bean

@Configuration
//获取配置文件中前缀为druid的数据,给成员变量一次性全部赋值
@ConfigurationProperties(prefix = "druid")
@Setter
public class DruidData {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    //value给每个成员逐个赋值
    //@Value("${druid.driverClassName}")
    //private String driverClassName;
    //@Value("${druid.url}")
    //private String url;
    //@Value("${druid.username}")
    //private String username;
    //@Value("${druid.password}")
    //private String password;
    @Bean
    //产生一个bean对象然后,将bean对象储存到spring容器中
    public DruidDataSource druidDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}

依赖注入(DI)
给对象类型的属性赋值
@Autowired:按照类型自动注入,如果Spring容器中同类型的对象有多个,可能注入失败,需要使用@Qualifier注解指定要注入的Bean的名称。
@Qualifier:结合@Autowired注解一起使用,指定要注入的Bean的名称。

@Controller
public class UserController {
    @Qualifier("userServiceImplA")
    //@Qualifier用于UserService 有多个实现类时指定获取某个实现类
    @Autowired
    private UserService userService;

    public void add() {
        System.out.println("UserController");
        userService.off();
    }
}

给普通类型的属性赋值【总】
@Value:常写在成员变量上,给成员变量注入普通类型的数据
@ConfigurationProperties:写在类上,给Bean的属性批量注入普通类型数据。
应用场景:常用来读取配置文件中的信息

拔高知识
SpringBoot整合Junit
lombok工具包
@NoArgsConstructor//生成空参构造【了解】
@AllArgsConstructor//生成全参构造【了解】
@Getter//生成getter方法【了解】
@Setter//生成setter方法【了解】
@EqualsAndHashCode//生成hashCode和equals方法【了解】
@ToString//生成toString方法【了解】
@Data//生成以上所有方法(除了全参构造方法),贼牛批【掌握】
@Slf4j//类中会生成一个log对象,用于输出日志【掌握】
Spring循环依赖【总】
现象:A对象内部注入了B对象,B对象内部注入了A对象,此现象就成为循环依赖。
set方式循环依赖
springboot2.6.0之前:不需要解决,Spring自动解决了。
springboot2.6.0及以后版本:需要在application.properties开启运行set方法循环依赖:

允许set方式循环依赖

spring.main.allow-circular-references=true
构造方式循环依赖【总】
必须人为解决:在任意一方构造方法中使用@Lazy注解标注注入的对象,含义是注入代理对象而非真实对象。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值