Spring-AOP学习笔记

Spring AOP【面向切面编程 】

将分散的功能块集中放到一个地方-切面

声明式的定义在何时何地使用这些功能

  • ==切面(Aspect)==:要实现的交叉的非核心业务功能
  • 连接点(Joinpoint):应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出

  • ==通知(Advice)==:通知切面的实际实现代码(抽出来的切面代码)

  • 切入点(Pointcut):定义通知应用在哪些连接点,就是一组连接点的集合;(控制哪些方法需要被通知,默认情况是每个方法都切入)

  • ==目标对象(Target)==:被通知的对象,代理模式中的真实对象;

  • ==代理(Proxy)==:将通知应用到目标对象之后,创建的对象

  • 织入(Weaving):将切面应用到目标对象,从而创建一个新的代理对象的过程

业务实现类也是对象
在使用时创建业务对象,通过getBean即可
采用切面,拦截业务核心,采用代理模式

代理模式;
代理对象帮真实对象做事,一般代理对象比真实对象专业,但是代理对象没有真实对象所拥有的某种实体(例如租房业务,中介没有房子,只有房东才有房子,但是中介可以找到更多的租客来租房)
代理对象帮真实对象调用方法,然后加上包装上自己的特长来更好的使用,辅助,加工这个方法;
真实的对象方法一般业务逻辑更少,所以交给更专业的代理来做更多的业务
代理对象和真实对象都实现同一个接口

Spring通知(advice)

  • 方法包围拦截(在方法执行前后分别拦截):该拦截器实现了MethodInterceptor接口;注意:==只要有该拦截器存在,此包围器连其他通知的 方法执行前后的拦截器也一起包围了,意思说,先执行该拦截器的前置拦截,再执行单纯的前置拦截, 方法执行后,先执行单纯的后置拦截,再执行本拦截==
  • 方法执行前拦截:实现了MethodBeforeAdvice接口,直接写要做的方法即可:
  • 方法执行后拦截:实现了AfterReturningAdvice,在方法执行完毕并且返回之后 调用本方法

配置如下:

     
     <bean id="petService"  class="com.wang.service.PetServiceImpl">
     bean>

     
     <bean id="exeTimeAdvice" class="com.wang.service.advice.ServiceExecuteTime">
     bean>


     
     <bean id="beforeExecute" class="com.wang.service.advice.ExecuteBeforeAdvice">
     bean>


        
     <bean id="afterExecute" class="com.wang.service.advice.AfterMethodAdvice">
     bean>

     
     <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
         <property name="mappedNames">
         <list>
         <value>切入的方法名,可以使用*来通配,例如get*,所有get方法都执行要切入的通知value>
         list>
         property>

     
        <property name="advice" ref="要执行的通知的id">
        property>
     bean>


     
     <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">


        
        <property name="target" ref="petService">property>
        
        <property name="interceptorNames">

            <list>

                <value>exeTimeAdvicevalue>
                <value>beforeExecutevalue>
                <value>afterExecutevalue>
                <value>假如要使用切入点,在此添加切入点id即可,但假如切入点有绑定以上通知,那么以上通知就不用再在这里设置,直接设置一个切入点即可value>
            list>
        property>

     bean>

自动创建代理


    <bean id="userDao" class="com.wang.dao.impl.UserDaoHibernateImpl">
    bean>


    
    <bean id="txAdvice" class="com.wang.dao.TransactionAdvice">
    bean>

    

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>*Daovalue>
            list>
        property>

        <property name="interceptorNames">
            <list>
                <value>txAdvicevalue>
            list>
        property>
    bean>

    在取的时候

    BeanFactory bf = new ClassPathXmlApplicationContext("springAopCfg.xml");
        IUserDao dao = (IUserDao) bf.getBean("userDao");

你可能感兴趣的:(Java学习笔记)