在person和cleanAir这两个类中,person类依赖于cleanAir类。以往来说,我们是在person类里亲自去new一个cleanAir类的对象,
而这里,Person类不必自己去new,他只需要被动地接收cleanAir对象。这种被动接收依赖对象的依赖方式叫依赖注入。由主动new到被动接收的过程叫做控制反转。
按“谁控制谁?控制什么?为何是反转?哪些方面反转了?"去分析。
Ioc容器控制对象
主要控制了外部资源的获取
因为由容器帮我们查找及注入依赖对象,对象只是被动地接收依赖对象,所以是反转
依赖对象的获取方式被反转了。
但是这样设计类也有不足的地方。
假如这个类依赖的不再是cleanAir而是dirtyAir,那么就要再增加一个dirtyAir类,还要修改person类的代码。这种强依赖有很大的弊端,一处的变化引起其他地方的变化,而且改变的知识Air,但是Person也要一起变。为了减少修改的地方,面向接口编程出现了。
这里定义了一个接口IAir,cleanAir和dirtyAir实现了IAir。Person类不再直接依赖Dirty类,而是依赖IAir接口。这样当Person需要依赖dirtyAir对象时,无需修改代码,只要给他修改注入的对象。这个注入的过程,利用Spring框架只需要改一下配置即可实现。
IOC底层实现
xml解析 工厂模式 反射
工厂模式:
IOC接口:
IOC思想基于IOC容器完成,IOC容器的底层是对象工厂
Spring提供IOC容器实现的两种方式:
(1)BeanFactory:IOC容器基本实现,是Spring内部实现的一个接口,不提供给(不建议)开放人员进行使用
(2)ApplicationContext:BeanFactory接口的子接口。提供了更多更强大的功能,一般是面向开放人员进行使用的。
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+鼠标点击即可实现