Spring核心思想 :
IOC控制反转
DI依赖注入
AOP切面编程
IOC思想:
场景描述:
在没有加入spring框架之前我们调取业务层时需要创建对象,例如: 接口名 变量名=new 接口的实现类();
问题描述.
接口和实现类之间会产生依赖关系,如果想切换接口的实现类我们就需要进行修改原代码,不利于管理;
解决上述问题;
我们使用工厂模式,把创建对象的过程放在工厂类当中,只需要修改源代码为接口名 变量名=工厂创建的对象过程;
在一定的程度对代码进行了优化,这样我们表面上把耦合性就降低了,其实并没有,
问题描述:工厂模式没有让我们从实质上去降低耦合度
解决方案:使用xml文件+Factory模式来对代码进行优化,
<bean name="UserService" class="com.fjk.shop.web.servlet.UserServlet"></bean>
接口名 变量名=Factory.getInstrance("UService");
思想:我们把具体的实现类写到xml中,让配置文件进行具体是实现类的管理,
在工厂中使用xpath技术解析xml标签去获取具体实现类的字符串再使用反射技术进行创建对象,这样我们就成功的把程序的耦合性就降低了
这一复杂过程就是IOC思想,控制反转就是解决了程序的耦合性,把创建对象的过程交给spring来管理,spring实现控制反转就是使用了xml+工厂模式+反射技术实现IOC
搭建基础的Spring框架来实现IOC控制反转案例
1.导入jar包
2.创建配置文件
默认路径为src根目录下,命名为applicationContext.xml
3.书写代码
创建UserService接口
public interface UserService { public abstract void login(); }
创建UserService的实现类UserServiceImp
public class UserServiceImp implements UserService{ @Override public void login() { System.out.println("login....."); } }
测试方法
@Test public void test01(){ //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //使用控制反转来实现对象的创建 UserService userService = (UserService) applicationContext.getBean("UserService"); userService.login(); }
ApplicationContext接口的实现类有两种: ClassPathXmlApplicationContext,FileSystemXmlApplicationContext;使用实现类来加载配置文件.会立即加载
BeanFactory接口的子接口有一个ApplicationContext,会延迟加载只有在getbean时才会创建bean;开发中不常使用.
AppliCationContext它会在配置文件加载时,就会初始化Bean,并且ApplicationContext 它 提 供 不 同 的 应 用 层 的 Context 实 现 。 例 如 在 web 开 发 中 可 以 使 用 WebApplicationContext.
DI依赖注入:
修改applicationContext.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING // DTD BEAN 2.0 // EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="UserService" class="com.baidu.test.UserServiceImp">
<property name="name" value="张三"></property>
</bean>
</beans>
UserServiceImp文件
public class UserServiceImp implements UserService{ private String name; public void setName(String name) { this.name = name; } @Override public void login() { System.out.println("login....."); System.out.println(name); } }
测试输出:
login..... 张三
使用xml文件注入了值
IOC和DI的区别:
IOC是控制反转,创建对象的过程交由spring来管理
DI是依赖注入,在创建对象的过程中,对象所依赖属性通过配置注入对象中.