Spring的IOC和AOP之深剖(4)

面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面

面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。

aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性

话不多说,我们直接来代码,加强理解

我们先看一个简单的例子:Spring AOP实现日志的输出,即后置增强和前置增强

我们看看代码

aop包下

我们要实现AfterReturningAdvice 接口

Spring的IOC和AOP之深剖

public class LoggerAfter implements AfterReturningAdvice {
    //save()之后执行它
    public void afterReturning(Object returnValue, Method method, Object[] arguments    ,
            Object target) throws Throwable {
        System.out.println("===========后置增强代码==========");
       
    }

}

前置,我们要实现MethodBeforeAdvice接口

Spring的IOC和AOP之深剖

*/
public class LoggerBefore implements MethodBeforeAdvice {
    //获取日志对象
    private static final Logger log = Logger.getLogger(LoggerBefore.class);
    //save()之前执行它
    public void before(Method method, Object[] arguments, Object target)
            throws Throwable {
        log.info("==========前置增强代码==========");
       
    }

}

实现类:

biz:

public class UserBiz implements IUserBiz {
    //实例化所依赖的UserDao对象,植入接口对象
      private IDao dao;
        public void save2(User user) {       
            //调用UserDao的方法保存信息
            dao.save(user);
        }
        //dao 属性的setter访问器,会被Spring调用,实现设值注入
        public IDao getDao() {
            return dao;
        }
        public void setDao(IDao dao) {
            this.dao = dao;
        }
       

dao:

public class UserDao implements IDao {
    /**
    * 保存用户信息的方法
    * @param user
    */
    public void save(User user) {
        System.out.println("save success!");
    }

}

src下的applicationContext.xml

<!--配置实现类  -->
  <bean/>
  <bean>
      <property ref="dao"></property>
  </bean>
  <!-- 定义前置增强组件 -->
  <bean/>
  <!-- 定义后置增强组件 -->
  <bean/>
      <!-- 代理对象 ProxyFactoryBean 代理工厂bean-->
    <bean>
    <property value="biz"></property>
    <property value="loggerBefore,loggerAfter"></property>
    </bean>

<!-- 针对AOP的配置
<aop:config>
 execution:调用那个方法
<aop:pointcut expression="execution(public void save2(cn.wgy.day01.entity.User))"/>
将增强处理和切入点结合在一起,在切入点处插入增强处理,完成"织入"
 <aop:advisor pointcut-ref="pointcut" advice-ref="loggerBefore"/>
 <aop:advisor pointcut-ref="pointcut" advice-ref="loggerAfter"/>
 </aop:config> -->

test

public static void main(String[] args) {

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d0a66771283e2103c6bdc01c098f5a37.html