Aop

作者: AAnna珠 | 来源:发表于2019-04-25 19:46 被阅读0次

    前置增强

    配置文件1

    <?xml version="1.0" encoding="UTF-8"?>
    <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="custoemrDao" class="com.neuedu.demo4.CustoemrDaoImpl"></bean>
        <!-- 配置增强/通知类 -->
        <bean id="beforeAdvice" class="com.neuedu.demo4.MyBeforeAdvice"></bean>
        <!-- Spring支持配置生成代理 -->
        <bean id="customerDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
            <!-- 设置目标对象 -->
            <property name="target" ref="custoemrDao"></property>
            <!-- 设置实现的接口,value中写接口的全路径 -->
            <property name="proxyInterfaces" value="com.neuedu.demo4.CustomerDao"></property>
            <!-- 配置一个切面 -->
            <property name="interceptorNames" value="beforeAdvice"></property>
            <!-- 强制使用CGLIB代理 -->
            <!-- <property name="optimize" value="true"></property> -->
        </bean>
        
        <!-- 带有切点的切面 -->
        <!-- 定义目标类 -->
        <bean id="orderDao" class="com.neuedu.demo5.OrderDao"></bean>
        <!-- 定义增强 -->
        <bean id="aroundAdvice" class="com.neuedu.demo5.MyAroundAdvice"></bean>
        <!-- 定义切面 -->
        <bean id="myPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <!-- 定义切点 -->
            <property name="patterns" value=".*add.*,.*fi.*"></property>
            <!-- 应用通知/增强 -->
            <property name="advice" ref="aroundAdvice"></property>
        </bean>
        <!-- 配置带有切点的切面的代理 -->
        <bean id="orderDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="orderDao"></property>
            <!-- 针对类的代理 -->
            <property name="proxyTargetClass" value="true"></property>
            <!-- 配置切面 -->
            <property name="interceptorNames" value="myPointcutAdvisor"></property>
        </bean>
        
    </beans>
    

    接口

    package com.neuedu.demo4;
    
    public interface CustomerDao {
        public void add();
        public void delete();
        public void update();
        public void find();
    }
    
    

    实现类

    package com.neuedu.demo4;
    //目标对象
    public class CustoemrDaoImpl implements CustomerDao {
    
        @Override
        public void add() {
            System.out.println("添加客户。。");
        }
    
        @Override
        public void delete() {
            System.out.println("删除客户。。");
        }
    
        @Override
        public void update() {
            System.out.println("修改客户。。");
        }
    
        @Override
        public void find() {
            System.out.println("查询客户。。");
        }
    
    }
    
    

    前置增强/通知类

    package com.neuedu.demo4;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.MethodBeforeAdvice;
    
    //通知/增强类(带有类型的:前置、后置、环绕、异常)
    public class MyBeforeAdvice implements MethodBeforeAdvice {
    
        @Override
        public void before(Method method, Object[] arg1, Object target) throws Throwable {
            System.out.println("前置增强。。。");
        }
    
    }
    
    

    测试类

    package com.neuedu.demo4;
    
    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;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:applicationContext.xml")
    public class SpringTest4 {
        
        @Autowired
    //  @Qualifier("custoemrDao")
        @Qualifier("customerDaoProxy")
        private CustomerDao customerDao;
        
        @Test
        public void demo1(){
            customerDao.add();
            customerDao.delete();
            customerDao.update();
            customerDao.find();
        }
    
    }
    
    

    配置文件与第一个配置文件同

    目标类

    package com.neuedu.demo5;
    //目标类,没有实现接口
    public class OrderDao {
    
        public void add() {
            System.out.println("添加订单。。");
        }
    
        public void delete() {
            System.out.println("删除订单。。");
        }
    
        public void update() {
            System.out.println("修改订单。。");
        }
    
        public void find() {
            System.out.println("查询订单。。");
        }
    }
    
    

    环绕增强类

    package com.neuedu.demo5;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class MyAroundAdvice implements MethodInterceptor {
    
        @Override
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            System.out.println("环绕前增强。。。");
            Object result = methodInvocation.proceed();
            System.out.println("环绕后增强。。。");
            return result;
        }
    
    }
    
    

    测试类

    package com.neuedu.demo5;
    
    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;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:applicationContext.xml")
    public class SpringTest5 {
        
        @Autowired
        @Qualifier("orderDaoProxy")
        private OrderDao orderDao;
        
        @Test
        public void demo1(){
            orderDao.add();
            orderDao.delete();
            orderDao.update();
            orderDao.find();
        }
    
    }
    
    

    自动代理

    BeanNameAutoProxyCreator :按名称生成代理

    配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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="com.neuedu.demo4.CustoemrDaoImpl"></bean>
        <bean id="orderDao" class="com.neuedu.demo5.OrderDao"></bean>
        <!-- 配置增强/通知类 -->
        <bean id="beforeAdvice" class="com.neuedu.demo4.MyBeforeAdvice"></bean>
        <bean id="aroundAdvice" class="com.neuedu.demo5.MyAroundAdvice"></bean>
        
        <!-- 自动代理:按名称的代理 基于bean生命周期的后处理Bean,后处理Bean不需要配置ID-->
        <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
            <property name="beanNames" value="*Dao"></property>
            <property name="interceptorNames" value="beforeAdvice"></property>
        </bean>
    
    </beans>
    

    测试类

    package com.neuedu.demo6;
    
    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;
    
    import com.neuedu.demo4.CustomerDao;
    import com.neuedu.demo5.OrderDao;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:applicationContext1.xml")
    public class SpringTest6 {
        
        @Autowired
        @Qualifier("customerDao")
        private CustomerDao customerDao;
        
        @Autowired
        @Qualifier("orderDao")
        private OrderDao orderDao;
        
        @Test
        public void demo1(){
            orderDao.add();
            orderDao.delete();
            orderDao.update();
            orderDao.find();
            
            customerDao.find();
        }
    
    }
    
    

    DefaultAdvisorAutoProxyCreator :根据切面中定义的信息生成代理

    配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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="com.neuedu.demo4.CustoemrDaoImpl"></bean>
        <bean id="orderDao" class="com.neuedu.demo5.OrderDao"></bean>
        <!-- 配置增强/通知类 -->
        <bean id="beforeAdvice" class="com.neuedu.demo4.MyBeforeAdvice"></bean>
        <bean id="aroundAdvice" class="com.neuedu.demo5.MyAroundAdvice"></bean>
        
        <!-- 定义一个带有切点的切面 -->
        <bean id="myPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="patterns" value=".*ad.*"></property>
            <property name="advice" ref="aroundAdvice"></property>
        </bean>
        
        <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
    
    </beans>
    

    测试类

    package com.neuedu.demo7;
    
    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;
    
    import com.neuedu.demo4.CustomerDao;
    import com.neuedu.demo5.OrderDao;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:applicationContext2.xml")
    public class SpringTest7 {
        
        @Autowired
        @Qualifier("customerDao")
        private CustomerDao customerDao;
        
        @Autowired
        @Qualifier("orderDao")
        private OrderDao orderDao;
        
        @Test
        public void demo1(){
            orderDao.add();
            orderDao.delete();
            orderDao.update();
            orderDao.find();
            
            customerDao.find();
            customerDao.add();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Aop

          本文链接:https://www.haomeiwen.com/subject/dectnqtx.html