在spring中ioc和aop有什么区别?原理是什么?
解决方案 »
- Spring MVC3.05 Contorler跳转传值问题,请教如何解决?
- 相邀您的鼠标..
- struts2一定需要配置spring的监听器吗?
- struts2.0<s:datetimepicker>标签如何设置CSS样式
- 比较怪异的问题,附件上传问题
- 求《jsp2.0技术手册》配套碟的源代码,我的碟坏了!!
- 做好的JSP网站能不能直接拿网上其他网站的HTML源码直接用?
- Jbuilder 生成webservice客户端的问题
- ------------------- 分割字符串的问题 ---------------------------
- nested exception is java.sql.SQLException: ORA-01008: 并非所有变量都已绑定
- 自学J2EE疑问,求关于上传图片资源文件方面的书籍。
- 大家帮我看一下这段QBC的查询有问题吗?为什么一段时间后服务器就崩了,无法再进行查询。。
AOP是向你在你某个方法执行之前, 之后等一些特定的时机插入一些其他的操作. 比如事务就是AOP
先给楼主转一篇,百度谷歌上还有很多篇。
AOP 就是在一个你规定的方法前或者后 加上你自己规定的特殊方法,使你的方法功能加强
上面说的不是很合适, 事务不是AOP, 而是说spring中的事务控制是用了AOP来完成.
http://www.360doc.com/content/08/0113/20/7635_970484.shtml
AOP 面向切面编程,动态代理
2. Avalon(Apache的一个复杂使用不多的项目)
第二种类型 使用JavaBeans的setter方法 1. Spring Framework,
2. WebWork/XWork
第三种类型 在构造方法中实现依赖 1. PicoContainer,
2. HiveMind 有过EJB开发经验的人都知道,每个EJB的调用都需要通过JNDI寻找到工厂性质的Home接口,在我的教程EJB是什么章节中,我也是从依赖和工厂模式角度来阐述EJB的使用。 在通常传统情况下,为了实现调用者和被调用者解耦,分离,一般是通过工厂模式实现的,下面将通过比较工厂模式和Ioc模式不同,加深理解Ioc模式。工厂模式和Ioc
假设有两个类B 和 C:B作为调用者,C是被调用者,在B代码中存在对C的调用:public class B{
private C comp;
......
}
实现comp实例有两种途径:单态工厂模式和Ioc。工厂模式实现如下:public class B{
private C comp;
private final static MyFactory myFactory = MyFactory.getInstance(); public B(){
this.comp = myFactory.createInstanceOfC(); }
public void someMethod(){
this.comp.sayHello();
}
......
}
特点:每次运行时,MyFactory可根据配置文件XML中定义的C子类实现,通过createInstanceOfC()生成C的具体实例。
使用Ioc依赖性注射( Dependency Injection )实现Picocontainer如下,B类如同通常POJO类,如下:public class B{
private C comp;
public B(C comp){
this.comp = comp;
}
public void someMethod(){
this.comp.sayHello();
}
......
}
假设C接口/类有有一个具体实现CImp类。当客户端调用B时,使用下列代码:public class client{
public static void main( String[] args ) {
DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(CImp.class);
container.registerComponentImplementation(B.class);
B b = (B) container.getComponentInstance(B.class);
b.someMethod();
}
}
因此,当客户端调用B时,分别使用工厂模式和Ioc有不同的特点和区别: 主要区别体现在B类的代码,如果使用Ioc,在B类代码中将不需要嵌入任何工厂模式等的代码,因为这些工厂模式其实还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。 使用Ioc带来的代价是:需要在客户端或其它某处进行B和C之间联系的组装。 所以,Ioc并没有消除B和C之间这样的联系,只是转移了这种联系。
这种联系转移实际也是一种分离关注,它的影响巨大,它提供了AOP实现的可能。Ioc和AOP
AOP我们已经知道是一种面向切面的编程方式,由于Ioc解放自由了B类,而且可以向B类实现注射C类具体实现,如果把B类想像成运行时的横向动作,无疑注入C类子类就是AOP中的一种Advice,如下图: 通过下列代码说明如何使用Picocontainer实现AOP,该例程主要实现是记录logger功能,通过Picocontainer可以使用简单一行,使所有的应用类的记录功能激活。首先编制一个记录接口:public interface Logging { public void enableLogging(Log log);}
有一个LogSwitcher类,主要用来激活具体应用中的记录功能:import org.apache.commons.logging.Log;
public class LogSwitcher
{
protected Log m_log;
public void enableLogging(Log log) {
m_log = log;
m_log.info("Logging Enabled");
}
} 一般的普通应用JavaBeans都可以继承这个类,假设PicoUserManager是一个用户管理类,代码如下:public class PicoUserManager extends LogSwitcher
{
..... //用户管理功能
}
public class PicoXXXX1Manager extends LogSwitcher
{ ..... //业务功能
}
public class PicoXXXX2Manager extends LogSwitcher
{ ..... //业务功能
}
注意LogSwitcher中Log实例是由外界赋予的,也就是说即将被外界注射进入,下面看看使用Picocontainer是如何注射Log的具体实例的。
DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(PicoUserManager.class);
container.registerComponentImplementation(PicoXXXX1Manager.class);
container.registerComponentImplementation(PicoXXXX2Manager.class);
..... Logging logging = (Logging) container.getComponentMulticaster();logging.enableLogging(new SimpleLog("pico"));//激活log
由上代码可见,通过使用简单一行logging.enableLogging()方法使所有的应用类的记录功能激活。这是不是类似AOP的advice实现? 总之,使用Ioc模式,可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构,因此,Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段,属于架构技术中一种重要的模式应用。J道的Jdon框架使用了Ioc模式,JiveJdon3.0是一个IOC/DI成熟应用。
aop为面向方面编程的意思,主要是在横切面执行相关逻辑,增加原有的功能。