Spring IOC、DI
什么叫IOC、DI
IoC:Inversion of Control —— 控制反转
DI:Dependency Injection —— 依赖注入
假设这么一个场景:
在A类中调用B类的方法,那么我们就称 A依赖B,B为被依赖(对象),相信这点大家能够理解。
传统做法:
(1)直接在A(方法)中new出B类对象,然后调用B类方法 —— 硬编码耦合;
(2)通过简单工厂获取B类对象,然后调用B类的方法 —— 摆脱了与B的耦合,却又与工厂产生了耦合;
以上两种做法,都是在A中主动去new或调用简单工厂的方法产生B的对象,注意,关键字是“主动”
Spring框架
在spring中,B的实例对象被看成Bean对象,这个Bean对象由spring容器进行创建和管理,当我们在配置文件中配置<Bean>下的<property>子元素时,spring就会自动执行在A中对B对象的setter方法(即A中需要有对B对象的setter方法),如此一来,A获取B的实例对象就不是由自己主动去获取,而是被动接受spring给它设值,那么,这个主动变为被动,就可以理解为“控制反转”。
而另一种说法,从spring容器的角度上看,它负责把A的依赖对象B(B是被依赖对象)注入给了A,所以我们可以理解为“依赖注入”
(spring中依赖注入的方式可不止调用setter方法一种,还有通过调用构造器的方式来实现,这里只是为了说明Ioc和DI,就不再累赘了)
IoC和DI的区别
IoC,控制反转,将传统的对象创建流程转变为交由框架进行创建和管理。在Spring中,对象的创建交给Spring进行配置。它包括依赖注入。
DI,依赖注入,向类的属性设置值。
IoC与DI的关系:依赖注入不能单独存在,需要在IoC基础之上完成操作。
Spring中的IOC操作
将对象的创建交由Spring框架进行管理。 IoC操作分为:IoC配置文件方式和IoC的注解方式。
Spring的bean管理
开发中:使用注解 取代 xml配置文件。
1、 @Component取代<bean class="">
@Component("id") 取代 <bean id="" class="">
在Spring中使用@Component注解Bean,但@Component只代表一个组件(Bean),使用时只需要将该注解标注相应类上即可。
2、 web开发,提供3个@Component注解衍生注解(功能一样)取代
@Repository :
对应数据访问层(DAO)
例如使用@Repository(value=”userDao”)注解是告诉Spring,让Spring创建一个名字叫”userDao”的UserDaoImpl实例
其功能和@Component一样。
@Service:
@Service标注的是业务层逻辑处理类Bean
比如使用@Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做”userService”
其功能和@Component一样。
@Controller:
@Controller用于标注在控制类(比如Spring MVC的Controller)
比如使用@Controller注解标识UserController之后,就表示要把UserController交给Spring容器管理,在Spring容器中会存在一个名字为”userController”的Controller,这个名字是根据UserController类名来取的
注:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=”UserController”)】或者【@Controller(“UserController”)】,则使用value作为bean的名字。
其功能和@Component一样。
3、 依赖注入,给私有字段设值,也可以给setter方法设值
普通值:@Value(" ")
引用值:
@Autowired :
@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。
当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,
当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。可以在 setter 方法中被用于自动连接bean。
@Qualifier() :
如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称,指定哪个真正的bean将会被装配,应用于一个接口有多个实现类的情况。
@Resource() :
功能与@Autowired一样,其区别在于@Autowired默认按照类型装配,而@Resource按照Bean实例名称进行装配。
@Resource有两个属性:name和type,Spring将name解析为Bean的实例名,type解析为Bean实例类型。
@Resource的装配顺序:
1.@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹。
2.指定了name或者type则根据指定的类型去匹配bean。
3,指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错。
4、生命周期
初始化:@PostConstruct
销毁:@PreDestroy
5、作用域
@Scope("prototype") 多例
注解使用前提,添加命名空间,让spring扫描含有注解类
- 感谢你赐予我前进的力量