SpringIOC/AOP
每次面试避不开的两个内容:
前置知识:动态代理、静态代理,单例模式、工厂模式、单例锁的问题
IOC:控制反转(Inversion of Control)
-
描述:
OOP中的一种设计原则,也是Spring框架的核心.
-
使用原因:
A B 两类互相引来 A中调用B
传统:A主动创建B
(1) A(方法)中new出B类对象,然后调用B类方法 —— 硬编码耦合;
(2) 简单工厂获取B类对象,然后调用B类的方法 —— 与工厂产生了耦合;
IOC:而ioc是把B 提前创建好,放到spring的容器里面。
B的实例对象被看成Bean对象,这个Bean对象由spring容器进行创建和管理,当我们在配置文件中配置下的子元素时,spring就会自动执行在A中对B对象的setter方法(即A中需要有对B对象的setter方法),如此一来,A获取B的实例对象就不是由自己主动去获取,而是被动接受spring给它设值,那么,这个主动变为被动,就可以理解为“控制反转”。
通过IOC则可以减少它们之间的耦合度,应用程序将对象的控制权转移给了第三方容器并通过它来管理这些被依赖对象,完成了应用程序与被依赖对象的解耦.
-
实现方法:
依赖注入与依赖查找。
依赖注入 : 应用程序被动的接收对象,
IoC
容器通过类型或名称等信息来判断将不同的对象注入到不同的属性中.依赖注入主要有以下的方式:
-
基于
set
方法 : 实现特定属性的public set()方法,来让IoC
容器调用注入所依赖类型的对象. -
基于接口 : 实现特定接口以供
IoC
容器注入所依赖类型的对象. -
基于构造函数 : 实现特定参数的构造函数,在创建对象时来让
IoC
容器注入所依赖类型的对象. -
基于注解 : 通过
Java
的注解机制来让IoC
容器注入所依赖类型的对象,例如Spring
框架中的@Autowired
.依赖查找 : 它相对于
依赖注入
而言是一种更为主动的方法,它会在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态.
- 常见实现:
- 第一种方式
<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- 指定class属性,通过构造方法创建Bean实例 -->
<bean id="person" class="com.mao.gouzao.Person">
</bean>
</beans>
public static void main( String[] args )
{
ClassPathXmlApplicationContext ctx = new Clas