传统的方法和使用spring的方法
使用spring,没有new对象,我们把创建对象的任务交给了spring的框架,通过配置用时get一下就行。
项目结构
applicationContext.xml
小明
UserService.java
package com.service;public class UserService { public String name; private BybService byeService; public String getName() { return name; } public void setName(String name) { this.name = name; } public BybService getByeService() { return byeService; } public void setByeService(BybService byeService) { this.byeService = byeService; } public void sayHello(){ System.out.println("hello " + name); byeService.sayBye(); }}
BybService.java
package com.service;public class BybService { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void sayBye(){ System.out.println("bye " + name); }}
Test.java
package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.service.BybService;import com.service.UserService;public class Test { public static void main(String[] args){ //我们先使用传统方法,来调用UserService的sayHello方法// UserService userService = new UserService();// userService.setName("小明");// userService.sayHello(); //我现在来使用spring来完成上面的任务 //1.得到spring的applicationContext对象(容器对象) //通过类路径加载文件,这个对象就对象applicationContext.xml文件 //这句话会导致spring文件被加载 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService us = (UserService)ac.getBean("userService"); us.sayHello(); //从ac(代表applicationContext这个容器)中取出 //BybService bybService = (BybService) ac.getBean("bybService"); //bybService.sayBye(); }}
spring的运行原理图
我们再看spring
对以前案例小结
spring实际上是一种容器框架,可以配置各种bean(action/service/domain/dao,spring各个层都可以接管),并且可以维护bean与bean之间的关系,当我们需要使用某个bean的时候,我们可以getBean(id),使用即可。
ioc是什么?
答:ioc(inverse of crontrol)控制反转:所谓控制反转就是把创建对象(bean),和维护对象(bean)的关系的权利转移到spring的容器文件(applicationContext.xml),通过配置文件就可以把创建对象和维护对象关系搞定,而程序的本身不再维护了,程序要什么就取什么。
学习框架,最重要的就是学习各个配置,配置搞清楚了,配置就明白了。
DI是什么?
答:(dependency injection)依赖注入:实际上DI和IOC是同一个概念,spring的设计者认为DI更准确地表示spring的核心技术。
大的项目(税务,证券,石油,财务,政务系统,oa,erp)有很多模块是通用的,
比方说:分页,数据源可以将其做成一个bean,再比如安全机制,写日志,都将其做成一个bean,用的
时候将这个bean注入进去就行了,这样开发就像搭积木了,用的时候引用一下就行了。
使用了spring变成的力度变大了,开发效率肯定会提高。
(汇编 指令编程,c 语句编程,Java对象编程,spring 组件编程)
把ApplicationContext做成一个单例的了
修改后的项目
项目结构
applicationContext.xml
小明
UserService.java
package com.service;public class UserService { public String name; private BybService byeService; public String getName() { return name; } public void setName(String name) { this.name = name; } public BybService getByeService() { return byeService; } public void setByeService(BybService byeService) { this.byeService = byeService; } public void sayHello(){ System.out.println("hello " + name); byeService.sayBye(); }}
BybService.java
package com.service;public class BybService { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void sayBye(){ System.out.println("bye " + name); }}
Test.java
package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.service.BybService;import com.service.UserService;import com.util.ApplicationContextUtil;import org.springframework.context.ApplicationContext;public class Test { public static void main(String[] args){ ((UserService)ApplicationContextUtil.getApplicationContext().getBean("userService")).sayHello(); }}
ApplicationContextUtil.java
package com.util;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;//工具类,保证applicationContext只能有一个final public class ApplicationContextUtil { private static ApplicationContext ac = null; private ApplicationContextUtil(){ } static{ ac = new ClassPathXmlApplicationContext("applicationContext.xml"); } public static ApplicationContext getApplicationContext() { return ac; }}