控制反转IOC

控制反转IOC

 

 


控制反转IOC

 

 在person和cleanAir这两个类中,person类依赖于cleanAir类。以往来说,我们是在person类里亲自去new一个cleanAir类的对象,

而这里,Person类不必自己去new,他只需要被动地接收cleanAir对象。这种被动接收依赖对象的依赖方式叫依赖注入。由主动new到被动接收的过程叫做控制反转。

按“谁控制谁?控制什么?为何是反转?哪些方面反转了?"去分析。

Ioc容器控制对象

主要控制了外部资源的获取

因为由容器帮我们查找及注入依赖对象,对象只是被动地接收依赖对象,所以是反转

依赖对象的获取方式被反转了。

但是这样设计类也有不足的地方。

假如这个类依赖的不再是cleanAir而是dirtyAir,那么就要再增加一个dirtyAir类,还要修改person类的代码。这种强依赖有很大的弊端,一处的变化引起其他地方的变化,而且改变的知识Air,但是Person也要一起变。为了减少修改的地方,面向接口编程出现了

控制反转IOC

 

 这里定义了一个接口IAir,cleanAir和dirtyAir实现了IAir。Person类不再直接依赖Dirty类,而是依赖IAir接口。这样当Person需要依赖dirtyAir对象时,无需修改代码,只要给他修改注入的对象。这个注入的过程,利用Spring框架只需要改一下配置即可实现。

IOC底层实现

xml解析 工厂模式 反射

工厂模式:

控制反转IOC

 

 

控制反转IOC

 

 

IOC接口:

IOC思想基于IOC容器完成,IOC容器的底层是对象工厂

Spring提供IOC容器实现的两种方式:
(1)BeanFactory:IOC容器基本实现,是Spring内部实现的一个接口,不提供给(不建议)开放人员进行使用
(2)ApplicationContext:BeanFactory接口的子接口。提供了更多更强大的功能,一般是面向开放人员进行使用的。
IOC接口这个概念貌似只有尚硅谷提到了,是否有这个概念还有待商榷。

控制反转IOC

 

选中一个类按CTRL+H可以查看他的类结构

IOC容器--bean管理xml方式

IOC容器--bean管理注解方式

注解的基本格式

@注解名称(属性名称=属性值,属性名称=属性值..)

注解可以作用在类,方法,属性上面

 创建对象

在类上使用@Component @Service @Repository @Controller 可以创建bean对象

其作用相当于在xml中配置:

<bean id="" class="com.company"></bean>

如果不添加属性的话,注解生成的bean对象,其id就是类名称首字母小写形式。

也可以@Component(value="")来指定id

这四个注解的功能都是一样的,只是语境不同,@Service用于Service层 ,@Repository用于dao层 ,@Controller用于Controller层,@Component应该是用于pojo层

使用注解是要开启组件扫描的,可以通过xml实现,也可以通过注解实现,个人喜欢完全注解开发,不希望有xml文件

完全注解开发:

创建一个配置类,在其上添加注解@Configuration以标识它是个注解类,

添加注解@ComponentScan(basePackages = {"com.company"}),以开启组件扫描,并指定扫描路径

关于@ComponentScan,要去了解他的属性,通过设置不同的属性,可以实现不同的扫描效果。

@Configuration
@ComponentScan(basePackages = {"com.company"})
public class Config {
}

使用注解注入属性

将依赖对象创建为bean对象后,我们是要去使用他的,所以下一步要进行依赖注入

注解关键字:

@Autowired:根据类型注入,但是,当一个接口有多个实现类时,就无法判断要注入哪一个实现类,所以要再使用@Qualifier以确定是哪一个实现类

@Qualifier:根据名称注入(即id,未设置情况下为类名称首字母小写形式),要与@Autowired一起使用

@Resource:可根据类型注入,也可根据名称注入

@Value:可以给普通类型(非对象类型)注入属性

每个注解的属性关键字是不同的,每次用就上百度查是不方便的,如何知道所用注解是如何定义的呢?

ctrl+鼠标点击即可实现

控制反转IOC

上一篇:不可错过的手机APP常见8种界面导航样式


下一篇:TPanel的默认颜色存储在dfm中,读取后在Paint函数中设置刷子的颜色,然后填充整个背景