Spring中的aop:scoped-proxy

 

Spring中的aop:scoped-proxy

 

      首先看一下Spring文档上的两个例子对比: 

< bean  id ="userPreferences"  class ="com.foo.UserPreferences"  scope ="session" />
< bean  id ="userManager"  class ="com.foo.UserManager" >
    
< property  name ="userPreferences"  ref ="userPreferences" />
</ bean >

 

< bean  id ="userPreferences"  class ="com.foo.UserPreferences"  scope ="session" >
    
< aop:scoped-proxy />
</ bean >

< bean  id ="userManager"  class ="com.foo.UserManager" >
    
< property  name ="userPreferences"  ref ="userPreferences" />
</ bean >

       前一个例子没有使用<aop:scoped-proxy/>,并且userManager是singleton,所有userManager仅被初始化一次,并且其属性userPreferences也仅被注射一次。当session失效后,userManager仍将保留userPreferences实例。但后一个例子则不一样,userManager的属性userPreferences指向的是com.foo.UserPreferences实例的代理,当session过期后,userManager的属性userPreferences自然也不能再使用。网上有人解释说,这个代理只随着session的创建而创建,销毁而销毁。

Spring AOPSpring框架中的一个重要模块,它提供了一种非常方便的方法用于实现面向切面编程。在Spring AOP中,我们可以通过声明式方式来定义切面,然后将切面应用到指定的方法上,从而实现对方法的增强。 一般来说,使用Spring AOP的步骤如下: 1. 定义一个切面类,实现对应的切面逻辑。 2. 在配置文件中声明一个切面,指定切面的类型、切点和通知。 3. 将切面应用到目标对象上,可以通过XML配置文件或者注解方式实现。 4. 测试切面的效果。 下面是一个简单的示例: ```java @Aspect public class LogAspect { @Before("execution(* com.example.service.*.*(..))") public void before(JoinPoint joinPoint) { System.out.println("before"); } @AfterReturning("execution(* com.example.service.*.*(..))") public void afterReturning(JoinPoint joinPoint) { System.out.println("afterReturning"); } } @Service public class UserServiceImpl implements UserService { @Override public void addUser(User user) { System.out.println("add user"); } } <bean id="logAspect" class="com.example.aspect.LogAspect"/> <aop:config> <aop:aspect ref="logAspect"> <aop:before pointcut="execution(* com.example.service.*.*(..))"/> <aop:after-returning pointcut="execution(* com.example.service.*.*(..))"/> </aop:aspect> </aop:config> <bean id="userService" class="com.example.service.UserServiceImpl"> <aop:scoped-proxy/> </bean> ``` 在上面的示例中,我们定义了一个切面类LogAspect,并将其声明为切面。然后,在XML配置文件中,我们指定了切点(execution(* com.example.service.*.*(..)))和通知(before和afterReturning),并将切面应用到UserService实现类上。 当调用UserService的addUser方法时,切面将会在方法执行前和执行后分别输出before和afterReturning。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值