SpringSpring中的两种自动代理

Posted 明渃筱曦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSpring中的两种自动代理相关的知识,希望对你有一定的参考价值。

这里说的自动代理说的是自动代理bean对象,就是说在xml中不用再配置代理工厂,就可以自动代理

下面来说第一种

第一种自动代理:默认自动代理生成器(DefaultAdvisorAutoProxyCreator)

第一步:定义接口,在接口中声明几个方法

package demo17;

/**
 * Created by mycom on 2018/3/8.
 */
public interface ISomeService {
    public void select();
    public void insert();
    public void delete();
    public void update();
}

第二步:编写实现类,重写接口中的方法

package demo17;


/**
 * Created by mycom on 2018/3/8.
 */
public class SomeServiceImpl implements ISomeService {

    public void select() {
        System.out.println("select  ok!");
    }

    public void insert() {

    }

    public void delete() {

    }

    public void update() {

    }
}

第三步:写一个前置增强

package demo17;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
 * Created by mycom on 2018/3/12.
 */
public class BeforeAdvice implements MethodBeforeAdvice {
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("before=======");
    }
}

第四步:配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
">
    <!--1.目标对象-->
    <bean id="service" class="demo17.SomeServiceImpl"></bean>
    <!--通知-->
    <bean id="beforeAdvice" class="demo17.BeforeAdvice"></bean>
    <!--顾问-->
    <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice" ref="beforeAdvice"></property>
        <property name="patterns" value=".*e.*"></property>
    </bean>
    <!--默认自动代理-->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

</beans>

最后一步:编写测试方法,进行单测

//默认自动代理
    @Test
    public void t1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextauto01.xml");
        ISomeService service =(ISomeService) context.getBean("service");
        service.select();
    }

运行结果如下:

第二种:名称自动代理生成器(BeanNameAutoProxyCreator)

步骤和上述的一样,在这里我就直接用上一种的接口和实现类了,xml中的配置有所不同

这里我有创建了一个接口和实现类,如果要配置多个对象,应该怎么配?

新创建的接口和实体类

package demo17;

/**
 * Created by mycom on 2018/3/12.
 */
public interface IBookService {
    public void select();
}
package demo17;

/**
 * Created by mycom on 2018/3/12.
 */
public class BookServiceImpl implements IBookService {
    public void select() {
        System.out.println("Book select");
    }
}

配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
">
    <!--1.目标对象-->
    <bean id="service" class="demo17.SomeServiceImpl"></bean>
    <bean id="bookService" class="demo17.BookServiceImpl"></bean>
    <!--通知-->
    <bean id="beforeAdvice" class="demo17.BeforeAdvice"></bean>
    <!--顾问-->
    <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice" ref="beforeAdvice"></property>
        <property name="patterns" value=".*e.*"></property>
    </bean>
    <!--名称自动代理-->
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames" value="service,bookService"></property>
        <property name="interceptorNames" value="advisor"></property>
    </bean>

</beans>

编写测试类

//名称自动代理
    @Test
    public void t2() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextauto02.xml");
        ISomeService service =(ISomeService) context.getBean("service");
        service.select();
        IBookService bookService =(IBookService) context.getBean("bookService");
        bookService.select();
    }

运行结果

 

以上是关于SpringSpring中的两种自动代理的主要内容,如果未能解决你的问题,请参考以下文章

Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

React中开启代理的两种方式

React中开启代理的两种方式

React中开启代理的两种方式

React中开启代理的两种方式

使用Vue脚手架配置代理服务器的两种方式