Ioc

Ioc:Inversion of Control 控制反转

DI:Dependency Injection 依赖注入

控制(对象创建权利)被反转(Ioc):

之前:

通过程序员手动new对象,UserService(new UserDao)----》UserDao;强耦合,再小的代码变更都会引起BUG的可能性

之后:

Spring(new UserService(); new UserDao();)

如果需要用到Spring管理的对象,需要依赖Spring注入(DI)

 

Bean

一、什么是Bean?

被Spring所管理的对象称为Bean。

概念Bean:

xml:<bean>

注解:@Component

 

spring容器创建方法:

xml方式:ClassPathXmlApplicationContext

配置类方式:AnnotationConfigApplicationContext

Springboot方式:ConfigurableApplicationContext

 

只有概念Bean进入Spring容器,被Spring容器管理才是真正的Bean。

image

 

二、如何配置Bean

1、<bean class="">

2、@Component

  a、@Service

  b、@Repository

  c、@Configuration

  ......

3、@Bean

  a、写在方法上面

  b、通常写在配置类里面

    @Bean方法调用另一个@Bean方法,会从spring容器中去获取

  c、可以干预bean的实例化过程,jar包中的类如果要配置bean就需要用@Bean

  d、在方法中声明的参数spring会帮我们自动注入进来

4、@Import

  a、@Import必须写在类上面

  b、标记的类必须是一个bean否则不会起作用

  c、普通类

    直接@Import(UserService.class)普通类,把普通类注入spring

  d、ImportSelector -- 用于根据完整限定名字字符串批量注入Bean

    1、定义一个类实现ImportSelector

    2、批量注册bean(通过实现selectImports(),返回bean的完整类路径字符串数组)

    3、@Import(实现ImportSelector的类)

  e、ImportBeanDefinitionRegistrar

    1、定义一个类实现ImportBeanDefinitionRegistrar

    2、根据beanDefinition注册bean

 

三、实例化Bean

1、@Component默认使用无参构造器实例化

  有多个构造函数依然会调用无参构造函数

  如果只有一个有参构造函数spring会调用,并且把参数自动装配进来

  如果有参构造函数有多个并且没有无参构造函数:会报错,需要一个无参构造函数

2、使用实例工厂方法实例化--@Bean

  可以自由的选择构造函数进行实例化

3、使用工厂Bean。实例化--FactoryBean

  FactoryBean是一个接口

  需要有一个Bean,一旦这个Bean实现FactoryBean就成为了特殊的Bean

  需要实现2个方法

    getObject --》 当通过Bean实际名称获取到的就是getObject返回的对象(伪装)

    getObjectType --》 想通过容器去获取对应(getObject返回的对象)的类型,就需要返回getObject返回的对象的类型;

  可以自由的选择构造函数进行实例化

 

依赖注入(DI)

一、@Autowired自动装配

要实现自动装配一定要使用@Autowired吗?

1、@Bean方法的参数会自动注入

2、构造函数上的参数会自动注入

 

特性:

1、可以写在方法、构造函数、字段、参数

2、首先会根据类型去spring容器中找(bytype),如果有多个类型,会根据名字再去spring容器中找(byname)

3、如果有多个类型,根据名字还是匹配不到,解决方案

  a、通过@Primary设置某一个为主要的

  b、通过@Qualifier("autowiredTestService2")告诉spring需要的那个bean的名字

4、如果去容器一个都没有找到就会报错

  a、通过@Autowired(required=false)设置required=false解决

posted @ 2026-02-27 13:09  幻影黑子  阅读(1)  评论(0)    收藏  举报