Spring动态代理开发

maven仓库导入必要jar包:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.1.14.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.8</version>
            <scope>runtime</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.3</version>
            <scope>runtime</scope>
        </dependency>
       
1.创建原始对象:
/*
原始类
 */
public class UserServiceImpl implements UserService{

    public void register(User user) {
        System.out.println("业务运算+DAO调用");
    }

    public void login(String name, String password) {
        System.out.println("UserServiceImpl.login");
    }
}

2.额外功能:MethodBeforAdvice接口
    1.额外功能书写在接口实现中,运行在原始方法执行之前。
    public class Before implements MethodBeforeAdvice {
    /*
    书写额外功能
     */
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("---method before advice log---");
    }
}
   Spring配置文件:
       <bean id="before" class="com.bao.spring.dynamic.Before"></bean>
        
3.定义切入点:额外功能加入的位置
        目的:自由指定原始方法加入额外功能
    配置文件:
    <aop:config>
<!--        pointcut:切入点-->
<!--        expression="execution(* *(..)):原始类所有方法加额外方法-->
        <aop:pointcut id="pc" expression="execution(* *(..))"/>
    </aop:config>
        
4.组装:切入点与额外功能整合
    <aop:config>
<!--        pointcut:切入点-->
<!--        expression="execution(* *(..)):原始类所有方法加额外方法-->
        <aop:pointcut id="pc" expression="execution(* *(..))"/>
<!--        组装,所有的原始方法都加入额外方法-->
        <aop:advisor advice-ref="before" pointcut-ref="pc"></aop:advisor>
    </aop:config>
        
5.调用:获得Spring工厂创建的动态代理对象
    注意:
         1.Spring的工厂通过原始对象的id值获得的是代理对象(原始类配置文件id:userService)
         2.获得代理对象后,可以通过声明接口类型,进行对象存储(动态代理类与原始类实现的共同UserService接口)
     @Test
    public void text2(){
        ApplicationContext app = new ClassPathXmlApplicationContext("springmvc4.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.login("陈宝","2816");
    }

动态代理类:Spring框架运行时,通过动态字节码技术,在JVM创建时运行在JVM内部,程序结束时和JVM一起消失。
动态字节码技术:
    动态代理不需要定义类文件,都是通过JVM运行过程中创建的,不会造成静态代理中类文件过多影响项目管理的问题。
    简化代理开发,在额外功能不改变的前提下,创建其他原始类代理对象时,只需配置文件指定原始对象。
    额外功能的维护性增强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值