spring基础知识
一控制反转IOC和依赖注入
首先这个控制反转就是依赖注入,他们说的是同样的意思,那么依赖是什么意思呢?就是我们使用某个类的意思,那么依赖注入就是我们在使用它时并不需要new,而是通过容器自动将依赖的对象注入到组件中。更具体的来说在使用依赖对象的类当中并不直接new某个类,而是提供一条该到这个依赖对象的通道(就是这个依赖对象的设置方法)。然后我们通过在BeanFactory类中“生产”使用依赖对象的类的实例和依赖对象,并完成这个依赖对象的调用。
比如:
<!--意思是new 一个UserServiceImpl对象,而service代表这个对象的引用-->
<bean id = "service" class = "test.spring.service.impl.UserServiceImpl">
<property name = "dao" ref = "dao"/>
<!--这句话就完成了依赖注入,它的意思是将UserDaoImpl实例dao注入给UserServiceImple,这个UserServiceImpl的一个实例对象的属性dao通过调动UserServiceImpl中的通道方法setDao来把这个dao注入进来或者我们叫它装配-->
</bean>
二什么是面向切面编程AOP
就是我们把共有的功能,我们提取出来,存放到一个“切面”中(也就是普通的java类),然后我们利用动态代理技术实现“切面”的“织入”。这样所有的业务逻辑处理模块就可以共用这些切面。
三AOP如何实现
使用了java的反射机制和动态代理机制。
AOP中的常用术语
1.切面:切面就是一个普通的java类,如日志切面,权限切面等,那么我们怎么把一个普通java类识别为切面呢,这需要在配置中指定。
2.通知:就是切面的具体实现,我们可以理解通知为切面这个类中的方法,我们以目标方法为参照点,根据放置的地方不同,分为前置通知(在目标方法之前)、后置通知(在没有异常的情况下运行)、异常通知(在这个目标方法中抛出了异常则执行这个通知)、最终通知(不管目标方法有没有抛出异常)、环绕通知(目标方法的前后都执行的通知),我们怎么知道某个方法是通知呢,我们在配置中指定。
<!-- 将LogAspectJ切面中的myBeforeAdvice方法定义成前置通知 -->
<aop:before pointcut-ref="logpointcut" method="myBeforeAdvice"/>
<!-- 将LogAspectJ切面中的myAfterReturningAdvice方法定义成后置通知 -->
<aop:after-returning pointcut-ref="logpointcut" method="myAfterReturningAdvice"/>
<!-- 将LogAspectJ切面中的myAfterThrowingAdvice方法定义成异常通知 -->
<aop:after-throwing pointcut-ref="logpointcut" method="myAfterThrowingAdvice" throwing="e"/>
<!-- 将LogAspectJ切面中的myAfterAdvice方法定义成最终通知 -->
<aop:after pointcut-ref="logpointcut" method="myAfterAdvice"/>
<!-- 将LogAspectJ切面中的myAroundAdvice方法定义成环绕通知 -->
<aop:around pointcut-ref="logpointcut" method="myAroundAdvice"/>
3.连接点:就是插入切面的地方,比如方法调用,异常抛出或字段修改,但Spring只支持方法级的连接点。不同于切入点,它是指即将切入切面的对象(目标对象)中插入切面的地方。也就是说,我们可以理解其为目标对象的一个方法。遇到这个方法时,被拦截下来,执行相应的“通知”,也就是方法!
4.切入点:定义通知应该切入在哪些连接点上,通过正则表达式来定义。我的理解是这样的,切入点和连接点都是同一个东西的不同角度不同范围罢了,他们是从不同的角度和不同的范围出发,切入点,是从切面的通知出发,定义我们想要切入的地方。而连接点是从目标对象出发,定义所以的可以切入的地方。所以连接点大于等于切入点。
如:
<!-- 定义切入点,切入点正则表达式execution(* test.spring.action.UserAction.*(..))
的意思是拦截test.spring.action.UserAction类中的所有方法,不论方法参数有无,
也不管返回结果为何类型。
-->
<aop:pointcut id="logpointcut" expression="execution(* test.spring.action.UserAction.*(..))"/>
就是定义切入点为test.spring.action.UserAction中的所有方法。也就是对于所有的方法,都要停顿下来,去完成相应的通知。
5.目标对象,目标对象即将切入切面的对象,被通知的对象,这些对象中只剩下了干干净净的代码,等待AOP容器的切入。但AOP容器并不直接调用目标对象,而是调用代理对象。
6.代理对象:是将通知应用到目标对象之后被动态创建的对象,可以理解为代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。但它对程序员透明,是程序运行中的产物。
7.织入:将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期,类装载期,运行期。但分别要求一个支持这种AOP实现的特殊编译器,一个支持AOP实现的特殊类装载器,发生在运行期时,则可直接通过java语言的发射机制与动态代理机制来动态实现。
四面向接口编程
引用百度知道的说法:所谓的面向接口编程可以降低程序之间的耦合度,是指在具体的调用处都是接口进行的,并不依赖于具体类
参见
http://zhidao.baidu.com/question/271744863.html