遇见spirng AOP编程(基于注解方式)

学习了spring的一点知识,简单写一点随笔吧。
Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 在我们之前学习Java的过程中,调用类中的非静态方法时,需要先创建类的对象,再通过该对象调用方法。而sping中控制反转(IoC)是指spring在创建对象的过程中,不是在代码里面实现的,而是交给spring本身来进行配置(包括使用配置文件和注解两种方式)。面向切面(AOP)就是相同的代码块抽取出来,通过springAOP编程来实现,可以简化代码。

下面介绍一下spring中的面向切面的ao编程。我们用类似数据库的更新操作来做一下示范。由于方便编码,对于更新操作,我们用打印一条语句来代替。
首先,我们定义一个接口UMapper,这里只写一个一个update()

public interface UMapper {
    public void update();
}

再定义一个用于实现UMapper接口的类,这个是主要相当于实现一个数据库的更新操作。@Component这里注解相当于自动将这个类自动生成一个对象。

import org.springframework.stereotype.Component;
@Component
public class UserMapperImpl implements UMapper {
    @Override
    public void update() {
        System.out.println("用户更新成功!");
    }
}

定义一个用于便于服务类的接口UService

public interface UService {
    public void motify();
}

用于一个实现UService服务类接口的实现类,

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UService {
    @Autowired
    private UserMapperImpl userMapper;
    @Override
    public void motify() {
        userMapper.update();
    }
}

这里的我用了自动装配@Autowired的注解,@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。若没有上面注解,需要在配置文件中配置<property name="属性名" value=" 属性值"/>

下面是aop部分代码的编写,@Aspect是通过注解的方式声明这个类是切面类。

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class UAop {
    //这一部分是说明aop代码部分用于匹配哪一个类下面的方法,并用一个方法表示后,后面注解中的就给可以用这个方法来代替实现简化代码。
    @Pointcut("execution(* yy.aop.UMapper.*(..))")
    public void anyMethod() {}
    //前置增强,用于在声明的方法之前调用
    @Before("anyMethod()")
    public void start() {
        System.out.println("开启事务");
    }
    //后置增强,用于在声明的方法之后调用
    @AfterReturning("anyMethod()")
    public void last() {
        System.out.println("释放资源");
    }
    //最终增强,用于在声明的方法最后调用
    @After("anyMethod()")
    public void commit() {
        System.out.println("提交事务");
    }
}

这部分是对aop编码的测试部分

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
//通过注解的方式解析配置文件
@ContextConfiguration("classpath:applicationContext-aop.xml")
public class TestAop {
    @Autowired
    ApplicationContext aContext;
    @Test
    public void start() {
    //可以通过如下的Java代码来解析spring的配置文件
        //ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext-aop.xml");
    //获得该类的一个实例对象
        //UService userServive=ctx.getBean("userServiceImpl", UserServiceImpl.class);
        UService userServive=aContext.getBean("userServiceImpl", UserServiceImpl.class);
    //方法调用,前后都会利用aop编程来优化代码
        userServive.motify();
        System.out.println();
        //UService goodsService=ctx.getBean("goodsServiceImpl",GoodsServiceImpl.class);
        UService goodsService=aContext.getBean("goodsServiceImpl",GoodsServiceImpl.class);
        goodsService.motify();
    }
}

光有上面的代码块的编写是远远不够的,诸如spring,springmvc.,mybatis,struts,hibernate这些框架都是需要配置文件的支持的。

   //用于扫描注解,使代码块中的注解能够生效
    <context:component-scan base-package="yy.aop"/>
    //开启aop注解编程模式
    <aop:aspectj-autoproxy proxy-target-class="true"/>

这样就可以实现一个简单的aop编程的实例了 !!!!!
sping框架的东西真的很灵活很宽泛,需要好好研究!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值