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。

二、如何配置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解决

浙公网安备 33010602011771号