ioc/DI控制反转及依赖注入
指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合。
- 简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象
- 拿到的对象的属性,已经被注入好相关值了,直接使用即可。
从示意图可以看出,当web容器启动的时候,spring容器就会开始初始化,会去xml配置文件中扫描的包下面获取到所有的类,并根据你使用的注解,进行对应javaBean的封装,封装到全局的bean容器中进行管理,一旦容器初始化完毕,beanID以及bean实例化的类对象信息就全部存在了,现在我们需要在某个service里面调用另一个bean的某个方法的时候,我们只需要依赖注入进来另一个bean的Id即可,
aop切面编程
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
- 面向对象oop的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。这样做的好处是降低了代码的复杂程度,使类可重用。但是人们也发现,在分散代码的同时,也增加了代码的重复性,比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,而不能将这些重复的代码统一起来。也许有人会说,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。
- 那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
- AOP其实只是OOP的补充而已。
- 在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP,其实就是给业务功能添加个辅助功能
//核心业务功能
<bean name="s" class="com.how2java.service.ProductService">
</bean>
//切面辅助功能
<bean id="loggerAspect" class="com.how2java.aspect.LoggerAspect"/>
//aop配置
<aop:config>
//切点配置业务功能
<aop:pointcut id="loggerCutpoint"
expression=
"execution(* com.how2java.service.ProductService.*(..)) "/>
//切面配置辅助功能
<aop:aspect id="logAspect" ref="loggerAspect">
//指定环绕切点,表示对com.how2java.service.ProductService 这个类中的所有方法进行切面操作
<aop:around pointcut-ref="loggerCutpoint" method="log"/>
</aop:aspect>
</aop:config>