您的位置:首页 > 编程语言 > Java开发

通过Spring Aop编程思想,利用注解为某些对象添加新的功能

2017-09-18 15:36 585 查看

通过Spring Aop编程思想,利用注解为某些对象添加新的功能

我们在利用Spring Aop的时候已经利用了切面来为原有的Bean中的方法新增了额外功能。那么我们也可以利用这个思路创建一个切面来为已有的Bean增点额外的功能(额外的方法)

以下是展示它是如何工作的



为了验证改思路是行的通,我们直接贴代码(亲测)

//方式一:利用注解
//引入bean
public interface Encoreable(){
//被引入的新曾方法
void performance();
}

//引入bean的实现类
@Service
public class DefaultEncoreable implements Encoreable {
@Override
public void encoreable() {
System.err.println("利用aop注解为对象增减新功能成功了");
}

}

public interface PerformService {
public void perform(int a);
}

@Service
public class PerformServiceImpl implements PerformService{
@Override
public void perform(int a){
System.err.println("11111111111111111");
}
}

//验证调用结果
public class AopT extends BaseTest{
@Resource
private PerformService performService;

@Test
public void get(){
Encoreable encoreable = (Encoreable)performService;
encoreable.encoreable();
}
}

@Aspect //当spring发现有一个此注解的时候,就会创建一个代理类然后将调用委托给被被代理的bean或者被引入的实现
public class EncoreableIntroducer(){
@DeclarParents(value="xx.xx.Performance+",defaultImpl=DefaultEncoreable.class)
public static Encoreable encoreable;
}
//与之前的切面一样要在Spring的配置文件里声明这个需要需要创建代理Bean的Bean
<bean class="xx.xx.EncoreableIntroducer"></bean>

//方式二:利用spring配置文件
<aop:config>
<aop:aspect>
<aop:declare-parents types-matching="xx.xx.Performance+"
implement-interface="xx.xx.xx.Encoreable" default-impl="encoreableDelegate" />
</aop:aspect>
</aop:config>
<bean id="encoreableDelegate" class="xx.xx.DefaultDecoreable"></bean>


可以看到EncoreableIntroducer是一个切面,但是他与我们熟知的切面不同,没有前置,后置,或者环绕的额外功能,但是通过@DeclarParents注解可以将Encoreable接口引入到Performance bean中

@DeclarParents注解由三部分组成

value:属性指的是那种类型的bean要引入该接口,在本例子中也就是所有的实现了Performance接口的Bean,”+”标识表示的是Performance的子类型而不是自己。

defaultImpl:属性指定了为引入功能提供的实现类,改例子中用DefaultEncoreable作为实现类

@DeclarParents标注的静态属性指明了要引入的接口,在本例子中我们引入的是Encoreable 接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: