什么叫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扫描含有注解类