SpringBoot-IoC、DI

IoC简介

IoC(Inversion of Control)控制反转,是一种设计原则。一般情况创建一个对象我们都会通过new关键字来操作,而IoC顾名思义由代码(也就是IoC容器)来控制对象的创建。
简单的说:通过使用IoC可以将对象的死活交给容器,由容器负责。

能做什么?

首先需要明确,IoC是一种设计原则,一种思想,通过这种原则设计可以让我们码出松耦合、优良的程序。

IoC容器

Spring IoC容器是一个管理Bean的容器,在Spring的定义中,它要求所有IoC容器都实现BeanFactory接口。

装配Bean到容器

Spring可以通过XML和java配置文件装配Bean,不过SpringBoot推荐使用注解的方式来装配Bean。

简单使用

一个简单的javabean

  • @Configuration 注解说明这是java的一个配置文件,spring的容器根据它来生成IoC容器去装配Bean。
  • @Bean 代表将initUser方法返回的POJO装配到IoC容器中,属性name就是bean的名称
public class User {
    private String name;
    /** setter and getter **/
}

一个用于配置bean信息的类


@Configuration
public class Appconfig {

   @Bean(name = "user")
    public User initUser(){
       User user = new User();
       return user;
   }

   @Bean(name="people")
    public People initPeople(){
       People people=new People();
       return people;
   }
}

使用bean

  • 使用AnnotationConfigApplicationContext来构建自己的IoC容器
 ApplicationContext ctx = new AnnotationConfigApplicationContext(Appconfig.class);
        User user =ctx.getBean(User.class);
        People people=ctx.getBean(People.class);
通过扫描装配Bean

创建一个可被扫描的javabean

  • @Component表明这个类会被IoC容器扫描装配 people就是该bean的名称
  • @Value是指定具体的值
@Component("people")
public class People {
    @Value("1")
    private Long id;
    @Value("name")
    private String Name;
}

配置类

  • @ComponentScan 它会扫描使用@Component注解的类
  • 但是注意@ComponentScan只会扫描它所在的包和其子包,其他路径的包是扫描不到的
  • 如果要扫描其他包可以为@ComponentScan指定basePackages
  • @ComponentScan使用详细总结(这里超链接)
@Configuration
@ComponentScan
public class Appconfig {

}

使用bean
和之前并没有什么区别

 ApplicationContext ctx = new AnnotationConfigApplicationContext(Appconfig.class);
        User user =ctx.getBean(User.class);
        People people=ctx.getBean(People.class);
使用第三方Bean
@Configuration
public class Appconfig {
   @Bean(name = "user")
    public User initUser(){
       User user = new User();
       return user;
   }
}

通过以上简单使用的Demo不难理解,装配一个Bean其实就是用@Bean注解定义一个返回该类型对象的函数,因此在使用第三方Bean的时候将User换成导入的第三方类即可。

IoC实现方式

IoC有两种实现方式:依赖注入和依赖查找。两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属性中,而后者是主动索取相应类型的对象,获得依赖对象的时间也可以在代码中自由控制。

依赖注入
  • 基于接口。实现特定接口以供外部容器注入所依赖类型的对象。
  • 基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。
  • 基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。
  • 基于注解。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口

在Springboot中依赖注入主要是基于注解来实现的

相关注解
  • @Autowired自动注入 可以和**@Qualifiler以及@Primary**配合使用来消除冲突
  • @Resource指定名称注入
  • @Service @Controller @Respository 用此注解标注的类相当于使用了@Component
实例

创建一个javabean

@Component
public class Test {
  public void saySome(){
      System.out.println("我是被注入进来的");
  }
}

通过@Autowired注解使用该bean

@Autowired
private Test test;

没错就是这么简单,使用@Autowired即可自动注入该bean

生命周期

在某些情景中,需要自定义初始化或者销毁Bean的过程,来满足Bean特俗初始化和销毁的要求,比如来使用数据库的时候,希望在关闭的时候调用close方法来释放数据库的连接资源。
Bean的生命周期:

  • Bean的定义
  • Bean的初始化
  • Bean的生存期
  • Bean销毁
Bean的初始化
资源定位
Bean定义
发布Bean定义
实例化
依赖注入
.....

Bean的生命周期
SpringBean生命周期

在生命周期中进行操作

方法:在编写bean的时候需要实现特定接口的特定方法,这样spring会自动调用这些方法

比如:BeanNameAware、BeanFactoruAware、ApplicationContextAware、InitializingBea、DisposableBean

初始化和销毁的方法实现
同样是在bean中自定义一个方法 使用上**@PostConstruct 和 @PreDestory**注解

@Postconstruct
public void init(){
}
@PreDestory
public void destory(){
}

Bean的作用域

Spring有如下集中作用域

类型范围描述
singleton所有spring应用默认值 ioc中只存在单例
prototype所有spring应用IoC取出一个bean就创建一个bean
sessionspring webHttp会话
applicationspring webweb工程生命周期
requestspring webweb单次请求
globalSessionspring web在一个全局的 HTTP Session 中, 一个 Bean 定义对应一个实例 。 实践 中基本不使用
修改作用域方法
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
 public class ScopeBean{
 }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是基于Spring Framework的,其中最重要的一个概念就是IOC(Inversion of Control,控制反转)和依赖注入(Dependency Injection,DI)。 IOC是一种设计模式,它的核心思想是将对象的创建和对象之间的依赖关系的维护交给一个容器来管理,而不是由应用程序自己去管理。在Spring Boot中,IOC容器负责管理应用程序中的对象,应用程序只需要定义对象的类型和依赖关系,容器就可以自动创建和管理这些对象,从而减少了应用程序的耦合度和代码的复杂度。 依赖注入是IOC的一种实现方式,它通过将对象的依赖关系注入到对象中,来解决对象之间的依赖关系问题。在Spring Boot中,依赖注入可以通过构造函数注入、Setter方法注入、注解注入等方式实现。 构造函数注入是通过在对象的构造函数中定义依赖关系的方式实现的,Spring Boot会自动调用构造函数来创建对象,并将依赖关系注入到对象中。 Setter方法注入是通过在对象的Setter方法中定义依赖关系的方式实现的,Spring Boot会自动调用Setter方法来设置对象的依赖关系。 注解注入是通过在对象的属性或方法上添加注解的方式实现的,Spring Boot会自动扫描应用程序中的注解,并自动将依赖关系注入到对象中。 总之,IOC和依赖注入是Spring Boot的核心思想,它们可以帮助我们更加高效地管理和维护应用程序中的对象和依赖关系,从而提高应用程序的可维护性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值