day39-Spring 05-Spring的AOP:不带有切点的切面

Spring底层的代理的实现:


不带切点的切面是对类里面的所有的方法都进行拦截.


做Spring AOP的开发需要两个包:一个是AOP的包,一个是AOP联盟的包(因为规范是由AOP联盟提出来的).


 


用Spring开发不用自己手写代码生成代理.Spring是可以通过配置生成代理的.


ProxyFactoryBean会帮你自动生成代理.

通过配置就可以让Spring自动生成代理对象了.这就是不带切点的切面.但是这种方式以后几乎不会用,因为你有一个类就得配置一段,你要是有一百个类就得配置一百次下面这段代码

  <!-- 手动生成代理太麻烦了.Spring支持配置生成代理: -->
  <!-- 代理对象 -->
  <bean id="customerDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      <!-- 设置目标对象 -->
      <property name="target" ref="customerDao"></property>
      <!-- 设置实现的接口,value中写接口的全路径 -->
      <!-- 类实现的接口的全路径 -->
      <property name="proxyInterfaces" value="cn.itcast.spring3.demo3.CustomerDao"></property>
      <!-- 需要使用value:要的名称 使用beforeAdvice对它进行增强 -->
      <property name="interceptorNames" value="beforeAdvice"></property><!--interceptorNames要拦截的名称  -->
      <!-- 这个是针对类的所有方法进行拦截的,你还没到配置方法的那一步呢 -->
  </bean>

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入beans的头 -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 定义目标对象 -->
     <bean id="customerDao" class="cn.itcast.spring3.demo3.CustomerDaoImpl">
  
  </bean>
<!-- 定义增强  增强对象-->
  <bean id="beforeAdvice" class="cn.itcast.spring3.demo3.MyBeforeAdvice">
  </bean>
  
  <!-- 手动生成代理太麻烦了.Spring支持配置生成代理: -->
  <!-- 代理对象 -->
  <bean id="customerDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      <!-- 设置目标对象 -->
      <property name="target" ref="customerDao"></property>
      <!-- 设置实现的接口,value中写接口的全路径 -->
      <!-- 类实现的接口的全路径 -->
      <property name="proxyInterfaces" value="cn.itcast.spring3.demo3.CustomerDao"></property>
      <!-- 需要使用value:要的名称 使用beforeAdvice对它进行增强 -->
      <property name="interceptorNames" value="beforeAdvice"></property><!--interceptorNames要拦截的名称  -->
      <!-- 这个是针对类的所有方法进行拦截的,你还没到配置方法的那一步呢 -->
  </bean>
</beans>
package cn.itcast.spring3.demo3;

public interface CustomerDao {
public void add();
public void delete();
public void update();
public void find();
}
package cn.itcast.spring3.demo3;

public class CustomerDaoImpl implements CustomerDao {

    public void add() {
        // TODO Auto-generated method stub
        System.out.println("添加客户");
    }

    public void delete() {
        // TODO Auto-generated method stub
        System.out.println("删除客户");
    }

    public void update() {
        // TODO Auto-generated method stub
        System.out.println("修改客户");
    }

    public void find() {
        // TODO Auto-generated method stub
        System.out.println("查询客户");
    }

}
package cn.itcast.spring3.demo3;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

/**
 * 前置增强
 * @author zhongzh
 *
 */
public class MyBeforeAdvice implements MethodBeforeAdvice{
    /*
     * method:执行的方法
     * args:参数
     * target:目标对象
     * 要对目标对象的某一方法增强
     * (non-Javadoc)
     * @see org.springframework.aop.MethodBeforeAdvice#before(java.lang.reflect.Method, java.lang.Object[], java.lang.Object)
     */
    public void before(Method method, Object[] args, Object target)
            throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("前置增强.....");
    }



}
package cn.itcast.spring3.demo3;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ContextConfiguration("classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTest3 {
    @Autowired
    //@Qualifier("customerDao")//和applicationContext.xml中配置的id=customerDao对应 注入的是真实的对象,必须注入代理对象.
    @Qualifier("customerDaoProxy")
    private CustomerDao customerDao;
    
    @Test
    public void demo1(){
        customerDao.add();
        customerDao.delete();
        customerDao.update();
        customerDao.find();
        
        
    }
    
}
原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6775401.html