http://zhidao.baidu.com/link?url=TVePPDbQU1n61s_Bu2FT9_YoJebaux8tYlNEZQhiHYHpT8QIbbyOSC8wDnpVmnmurwNntgNpRqwFkMcu8U9K8K
其实我一开始也好楼主有同样的困惑,但是在项目的慢慢积累,感觉spring的配置文件太有才了
我就和你分享一点:那就是软件的后期维护
比如说有一个订单的DAO接口:interface OrderDAO
在开发的时候我是用的MySql数据库,实现类为 class MySqlOrderDAOImpl implements OrderDAO
在业务代码里面,我要使用OrderDAO,这没什么难的,直接new一个对象不就行了吗,于是我就这样了:
OrderDAO dao = new MySqlOrderDAOImpl();
轻松完成,最后项目完成,实施运营了,后来客户发现MySql不行了,要换成Oracle,这不难,我在写一个OrderDAO的实现类不就行了吗,于是我两指一挥:
class OracleOrderDAOImpl implements OrderDAO
可是这样就又来了一个麻烦就是在我的业务代码里面,我都是自己new的对象,都是“MySqlOrderDAOImpl”,
没问题,把 “MySqlOrderDAOImpl” 替换成”OracleOrderDAOImpl “就可以了
于是,全体动员,查找“MySqlOrderDAOImpl”然后替换成”OracleOrderDAOImpl “,这样浪费了半天,还可能有些地方还没替换呢
=============================================
后来就想到了spring的Ioc,在配置文件里配置OrderDAO的实现类就可以了,只要OrderDAO的有新的实现类,我只是在配置文件中修改一下就可以了,大概需要几秒钟吧,时间太快,没法计算啊(呵呵)
不带Ioc :http://blog.csdn.net/tydldd1/article/details/8107786
Aop:http://www.blogjava.net/javadragon/archive/2006/12/03/85115.html
http://outofmemory.cn/code-snippet/3762/Spring-AOP-learn-example
我理解的ioc 控制反转,所谓的控制翻转就是在配置文件中配置一些信息,要用的地方通过读取配置文件反射出要用的实体,这个实体有一个基类或者接口,将反射的实体赋值给
基类或者接口,调用基类或者接口的方法,会调用重写或者实现的接口方法,这样的话A,B实体都实现了接口I,只需要在配置文件中修改时用A还是B,在调用的地方都是用I来操作,也就不需要知道到底是A在用还是B在调用。
控制翻转的实现原理见http://blog.csdn.net/it_man/article/details/4402245
- ApplicationContext context = new FileSystemXmlApplicationContext(
- "applicationContext.xml");
下面简单叙述一下ioc到底做了什么。
<bean id="test" class="Test"> <property name="testMap"> <map> <entry key="a"> <value>1</value> </entry> <entry key="b"> <value>2</value> </entry> </map> </property> </bean>
首先会解析配置文件,
将我们配置的信息保存在一个HashMap中,HashMap的key就是Bean 的 Id ,HasMap 的value是这个Bean,只有这样我们才能通过context.getBean("animal")这个方法获得Animal这个类。
它是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。
最后它将这个类的实例返回给我们,我们就可以用了
IoC就是对象的创建,依赖都由Spring及配置文件控制
AOP就是统一的给一些类似的方法加上同样的功能,比如日志,事务