• Spring第四天


    Day04

    一、课程回顾:

    1.静态代理:

    代理类中要求和被代理类中有相同的方法,所以创建代理类后需要实现相同的接口

    在代理类中添加目标对象 因为要执行目标对象中的方法

    添加事务代码

    在客户端中(Servlet中)创建UserServiceImpl时 改成创建代理对象

    2.JDK动态代理:

    1.创建动态代理类 声明一个获取代理对象的方法

    2.通过反射创建代理对象

    3.使用:

    3.CGLib动态代理:

     1.创建动态代理类 声明一个获取代理对象的方法

    2.通过Enhancer对象创建代理对象

    public static Object getProxy(final Object target, final TXManager txManager){

    Enhancer enhancer = new Enhancer();

    //设置接口

    enhancer.setInterfaces(target.getClass().getInterfaces());

    //设置父类

    enhancer.setSuperclass(target.getClass());

    //设置回调

    enhancer.setCallback(new MethodInterceptor() {

    @Override

    public Object intercept(Object proxy, Method method, Object[] args,

    MethodProxy arg3) throws Throwable {

    txManager.begin();

    Object result = method.invoke(target, args);

    txManager.commint();

     

    return result;

    }

    });

    return enhancer.create();

    }

    3.使用:

    4.SpringAOP

    回顾概念:

    切面

    通知

    连接点

    切入点

    满足了切入点规则的连接点 才能执行到切面类中的通知方法

    1.导包+添加约束

    2.创建事务切面类和通知方法

    3.在配置文件中配置AOP

    4.使用:通过SpringAOP可以不改动任何业务层的代码,耦合度非常低

    二、切入点的execution表达式

    在参考手册中的位置

    •  execution(public * *(..))

    工程中所有的public方法

    • execution(* set*(..))

    工程中所有方法名以set开头的方法

    • execution(* com.xyz.service.AccountService.*(..))

    com.xyz.service.AccountService类下面的所有方法

     

    • execution(* com.xyz.service.*.*(..))

     

    com.xyz.service包下所有类的所有方法

     

    • execution(* com.xyz.service..*.*(..))

    com.xyz.service包下及其子包下所有类的所有方法

    execution(* com.xyz..service.*.*(..))

    报名以com.xyz开头的所有子包一直子到service下的所有类的所有方法

    举例:com.xyz.a.b.service com.xyz.a.service  com.xyz.a.b.c.service 会满足上面的条件

     

    三、五大通知:

    1.环绕通知 around

    5个中最强大的通知,唯一一个能在通知中控制目标方法是否执行的通知

     

     

    2.前置通知 before

    前置通知代码:

     

    前置通知配置

     

     

    3.后置通知

    如果出现异常后置通知不执行

    代码:

     

    配置:

     

    4.异常通知:

    代码:

     

    配置:

     

    如果JoinPoint不在第一位会报错

    异常通知可以用来记录错误日志和事务的回滚

    5.最终通知:

    不管什么情况最终通知都会执行

    代码:

    配置:

    四、AOP注解

    步骤:1.在配置文件中把aop注解开关打开

    2.通过注解配置切面类

    3.通过注解配置通知方法

    前置通知:

    后置通知:

    异常通知:

    最终通知:最终通知不是最后的意思,是肯定会执行的通知

    环绕通知:

    五、通过注解生成切入点表达式的引用

    1.创建一个空的方法

    使用@Pointcut注解生成一个切入点的引用

    2.使用:

    六、环绕通知嵌套问题

    七、各种练习

    1.异常:

    代码结构如图所示

    PersonServlet

    PersonService

    PersonDao

    用异常通知捕获servlet的所有的方法抛出的异常:

    目标对象所在的类 cn.tedu.big1601.servlet.PersonServlet

    抛出异常所在的方法     save()

    抛出异常的名称         XxxException

    异常信息 message

    意义:

    异常处理类和业务逻辑类完全松耦合。

    时刻捕获生产生产环境中所有的错误,实时监控该系统,异常收集。

    实现方式:

                                         

    2.方法执行的时间

    计算servlet的各个类的各个方法的执行时间

    1.类的名称

    2.方法的名称           

    3.执行的时间

    控制台输出

    意义:用来监控程序的性能问题

    代码:

    3.事务

    public class PresonServiceImpl{

    @Transactional

    public void savePerson(){

    }

    public void queryPerson(){

    }

    }

    当方法上有事务的注解,该方法就有事务。

    写一个切面来完成

    1.声明一个自定义的注解类

    2.实现方式:

    4.权限控制

    public class PersonServiceImpl{

    @PrivilegeInfo(name="saveperson") //要访问PersonSserviceImpl中的savePerson方法必须具备"saveperson"的权限

    public void savePerson(){

    xxxxxxxxx

    }

    }

    List<Privilege:name>  用户所拥有的权限

    写一个切面:

    说明:每个方法上添加能够执行该方法的注解@PrivilegeInfo  并且要指明

    PrivilegeInfo(name=”add”)   那么将来这个方法只能执行还有add权限的方法。

    List里边存放是当前用户所有权限

    List[add,del,update]   这是用户提供的    通过静态类的方法传递参数。

    @PrivilegeInfo(name=”find”)

    Public void add(){

    }

    实现步骤:

    1. 创建自定义的注解PrivilegeInfo
    1. 自定义注解的使用
    1. 模拟用户拥有的权限

    创建一个静态的list保存用户的权限

    1. 切面类:
    1. 测试:

    5.缓存

    public class PresonDaoImpl{

    @Cacheable(name="put")

    public void savePerson(Person person){

    person对象放入到数据库中

    }

    @Cacheable(name="get")

    public Person getPerson(Long id){

    根据id从数据库中查找数据

    }

    }

    Map<Long,Person>

  • 相关阅读:
    最大子数组求和并进行条件组合覆盖测试
    Ubuntu 16.04 c++ Google框架单元测试
    The directory '/home/stone/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If execu
    Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
    个人博客作业三:微软小娜APP的案例分析
    补交 作业一
    补交 作业二:个人博客作业内容:需求分析
    嵌入式软件设计第12次实验报告
    嵌入式软件设计第11次实验报告
    嵌入式软件设计第10次实验报告
  • 原文地址:https://www.cnblogs.com/dxp5201/p/8921773.html
Copyright © 2020-2023  润新知