spring三大核心学习(一)---控制反转
2016-02-17 13:43
381 查看
记得当年大学时候,java的企业级框架还是ssh的天下(spring,struts和hibernate),但是现在,感觉spring已经完全把那两个框架甩在后边了。用spring的人越来越多,用struts的人比原来少多了,用hibernate的就更少了。毕竟现在it人才流动性太大了,招人上来上手很重要,谁知道他什么时候就跑了。。(hibernate太复杂了)。 我最近只看spring,所以只说spring。 记得当初面试的时候被问到过spring的三大核心思想。相信多数javaer都被问到过这个问题。绝大多数人应该都知道这三个核心思想是什么:控制反转,依赖注入和面向切面编程。 印象很深,因为当时对spring不熟,所以被面试官狠狠得鄙视了。。。这几天把这三个功能点复习一下。 以下内容全是个人理解(免责声明o(∩_∩)): 首先,spring最核心,最基础的概念是什么?将spring类比java,java最核心,最基础的概念就是object了。java中,所有的操作都是针对object的(基础类型除外),java中,一切皆对象,一切都是object。类比下来,spring中最基础的概念是bean。在spring中,所以的类都可以认为是一个bean。(个人认为)在spring中的所有文件,都可以认为是注册了的bean和未注册的bean。spring中所有操作都是针对bean的操作。自然,spring的三大核心思想中操作的对象,也是bean。 spring三大核心思想之一:IOC,控制反转。 想理解什么叫控制反转,首先要理解什么叫控制没有反转。 看下面代码: 首先有一个接口类:
packagetestSpring.business.iface; /** *INetPlay:打印接口,对象需要实现这个接口来实现打印该对象的功能 * *@authorxuejupojpxue@travelsky.com * *createin2016-2-16上午9:16:52 */ publicinterfaceIPrint{ /** *onLine:对象需要实现这个方法来实现打印对象的功能 *void返回类型 */ StringprintObject(); }
然后两个实现类:
packagetestSpring.business.bean; importorg.springframework.stereotype.Repository; importtestSpring.business.iface.IPrint; /** *UserBean: *@authorxuejupojpxue@travelsky.com *createin2016-2-16上午9:22:39 */ publicclassUserBeanimplementsIPrint{ @Override publicStringprintObject(){ //TODOAuto-generatedmethodstub System.out.println("打印对象UserBean:"); return"abc"; } } packagetestSpring.business.bean; importorg.aspectj.lang.annotation.Aspect; importorg.aspectj.lang.annotation.Pointcut; importorg.springframework.stereotype.Service; importtestSpring.business.iface.IPrint; /** *MyBean: *@authorxuejupojpxue@travelsky.com *createin2016-2-16上午10:11:43 */ publicclassMyBeanimplementsIPrint{ @Override publicStringprintObject(){ //TODOAuto-generatedmethodstub System.out.println("打印对象MyBean:"); returnnull; } }
现在,我想打印第一个实现类,客户端代码如下:
IPrintprint=newUserBean(); print.printObject();
很简单的代码,这时候对实现类UserBean对象的创建,是由客户端完成的。相当于客户端控制着UserBean对象的创建。代码自然没什么问题,执行结果如下:
打印对象UserBean:
很正常的执行结果。但是这时候我想修改一下,打印第二个实现类,这时候就需要修改代码了。对于正式的系统来说,修改代码毕竟是不符合开闭原则,又比较麻烦的事。所以就想能不能用配置文件来代替代码的修改。这时候就需要用到spring的控制反转:对继承了接口IPrint的具体实现类的具体对象的创建,不依赖于调用他的客户端代码,而将控制权交给spring(其实就是xml文件),这就是控制反转。
下面是xml文件(注册bean):
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"><!--注册bean--!> <beanid="userBean"class="testSpring.business.bean.UserBean"/> </beans>
其中,文件头那一大坨类似网址的东西,我没测试过是啥,网上说是spring的标签规范检验文件的路径。首先他会查找你本地的标签规范文件(一般都有),如果本地没找到就会到他的url里面去找。
测试代码如下:
//读取配置文件(将配置文件中的bean加载进内存) ApplicationContextctx=newClassPathXmlApplicationContext("/testSpring/resources/applicationContext.xml"); //获取的实例 IPrintbean=(IPrint)ctx.getBean("userBean"); //调用方法 bean.printObject();
结果:
打印对象UserBean:
如果想要打印另一个实现类,只要修改配置文件:
<beanid="userBean"class="testSpring.business.bean.MyBean"/>
理解起来应该算挺容易的,就是将创建哪个具体对象的控制权交到spring的xml文件中,这就是简单的控制反转了。
相关文章推荐
- java学习笔记之hibernate
- JAVA class 编译jar。 控制台使用jar
- 蓝桥杯 求圆的面积 保留7位
- java IO 流
- 项目检出JRE问题(Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'jeecg')
- hello Kotlin
- java中的 泛型和?组合使用时什么意思
- org.springframework.web.context.ContextLoaderListener
- 关于springmvc报的空指针的异常,就是在这个service方法报空指针的原因
- [置顶] springMVC session的应用@SessionAttributes和@ModelAttribute
- Spring学习笔记——Spring中的BeanFactory与FactoryBean
- 关于工程导入eclipse中的问题
- struts2学习笔记--使用struts2插件实现ajax处理(返回json数据)
- @Override覆盖不了spring-web.jar中的方法
- 自定义 Java Annotation
- Java api 入门教程 之 JAVA的IO处理
- Java for循环用法
- Java compiler level does not match the version of the installed Java project facet.解决方法
- 爬楼梯算法-java(递归与非递归)
- Spring 管理下的web项目,对Properties文件重要参数的加密解密处理(续)