Spring Aop

Aop:

  面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。

1:主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。

2:主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,

      我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

AOP的一些实现:

用AOP给service加一些其他的功能

Dao层:

  1. package cn.spring.mapper;
  2.  
  3. import cn.spring.entity.User;
  4.  
  5. public interface IUserMapper {
  6.  
  7. public Integer addUser(User userinfo);
  8. }

Dao层实现类

  1. package cn.spring.mapper.impl;
  2.  
  3. import cn.spring.entity.User;
  4. import cn.spring.mapper.IUserMapper;
  5.  
  6. public class IUserMapperImpl implements IUserMapper {
  7. @Override
  8. public Integer addUser(User userinfo) {
  9. System.out.println("addUser");
  10. return 0;
  11. }
  12. }

Service层

  1. package cn.spring.service;
  2.  
  3. import cn.spring.entity.User;
  4.  
  5. public interface IUserService {
  6.  
  7. public Integer addUser(User userinfo);
  8. }

Service层实现类:

  1. package cn.spring.service.Impl;
  2.  
  3. import cn.spring.entity.User;
  4. import cn.spring.mapper.IUserMapper;
  5. import cn.spring.service.IUserService;
  6.  
  7. public class IUserServiceImpl implements IUserService {
  8.  
  9. private IUserMapper iUserMapper;
  10.  
  11. public IUserMapper getiUserMapper() {
  12. return iUserMapper;
  13. }
  14.  
  15. public void setiUserMapper(IUserMapper iUserMapper) {
  16. this.iUserMapper = iUserMapper;
  17. }
  18.  
  19. @Override
  20. public Integer addUser(User userinfo) {
  21. Integer integer = iUserMapper.addUser(userinfo);
  22. return integer;
  23. }
  24. }

第一种方法:实现MethodBeforeAdvice(前置增强)接口,AfterReturningAdvice(后置增强)接口

  1. 增强类:
  1. package cn.spring.advice;
  2.  
  3. import org.springframework.aop.AfterReturningAdvice;
  4. import org.springframework.aop.MethodBeforeAdvice;
  5.  
  6. import java.lang.reflect.Method;
  7.  
  8. public class AdivceMethod implements MethodBeforeAdvice, AfterReturningAdvice {
  9. @Override
  10. public void before(Method method, Object[] objects, Object o) throws Throwable {
  11. System.out.println("====================日志=================");
  12. }
  13.  
  14. @Override
  15. public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
  16. System.out.println("====================事务=================");
  17. }
  18. }
  1. applicationcontextbean.xml
  1.   将Dao层与service层进行关联
      <bean id="iUserMapper" class="cn.spring.mapper.impl.IUserMapperImpl"></bean>
  2. <bean id="iUserService" class="cn.spring.service.Impl.IUserServiceImpl">
  3. <property name="iUserMapper" ref="iUserMapper"></property>
  4. </bean>
  5.  
  6.   找到要增强类
  7. <bean id="Adivec" class="cn.spring.advice.AdivceMethod"></bean>
  1.   配置aop
  2. <aop:config >
  3. <aop:pointcut id="pointcut" expression="execution(* *..service.*.*(..))"/>   找到在那增强,并指定增强哪里的内容
  4. <aop:advisor advice-ref="Adivec" pointcut-ref="pointcut"></aop:advisor>    调用增强
      </aop:config>

  测试类:

  1. package cn.spring.test;
  2.  
  3. import cn.spring.entity.User;
  4. import cn.spring.print.print;
  5. import cn.spring.service.IUserService;
  6. import org.junit.Test;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;
  9.  
  10. public class aoptest {
  11. @Test
  12. public void test(){
  13. ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontextbean.xml");
  14. IUserService bean = (IUserService)context.getBean("iUserService");
  15. bean.addUser(new User());
  16. }
  17. }

  结果:

第二种方法:不实现MethodBeforeAdvice(前置增强)接口,AfterReturningAdvice(后置增强)接口

  1. 增强类:
  1. package cn.spring.advice;
  2.  
  3. public class Adivce{
  4. public void before(){
  5. System.out.println("基于配置的前置");
  6. }
  7. public void after(){
  8. System.out.println("基于配置的后置");
  9. }
  10. }
  1. applicationcontextbean.xml
  1.   将Dao层与service层进行关联
      <bean id="iUserMapper" class="cn.spring.mapper.impl.IUserMapperImpl"></bean>
  2. <bean id="iUserService" class="cn.spring.service.Impl.IUserServiceImpl">
  3. <property name="iUserMapper" ref="iUserMapper"></property>
  4. </bean>
  1. <bean id="befor" class="cn.spring.advice.Adivce"></bean>
  2. <aop:config >
  3. <aop:pointcut id="pointcut" expression="execution(* *..service.*.*(..))"/>
  4. <aop:aspect ref="befor">
  5. <aop:before method="before" pointcut-ref="pointcut"></aop:before>
  6. <aop:after method="after" pointcut-ref="pointcut"></aop:after>
  7. </aop:aspect>
  8. </aop:config>

  结果:

Spring Ioc的三种注入方式:

实体类:

  1. package cn.spring.entity;
  2.  
  3. public class User {
  4. private Integer id;
  5. private String username;
  6.  
  7. public Integer getId() {return id; }
  8.  
  9. public void setId(Integer id) { this.id = id;}
  10.  
  11. public String getUsername() {return username;}
  12.  
  13. public void setUsername(String username) { this.username = username;}
  14.  
  15. public User(Integer id, String username) {
  16. this.id = id;
  17. this.username = username;
  18. }
  19.  
  20. public User() {
  21. }
  22.  
  23. @Override
  24. public String toString() {
  25. return "User{" +
  26. "id=" + id +
  27. ", username='" + username + '\'' +
  28. '}';
  29. }
  30. }
  1. 基于Setter注入:
  1. applicationcontextbean.xml
  1. <bean id="user" class="cn.spring.entity.User">
  2. <property name="id" value="1"></property>
  3. <property name="username" value="李一"></property>
  4. </bean>-->
  1. 基于构造注入:
  1. <bean id="user" class="cn.spring.entity.User">
  2. <constructor-arg value="2" type="java.lang.Integer" index="0"></constructor-arg>
  3. <constructor-arg value="王二" type="java.lang.String" index="1"></constructor-arg>
  4. </bean>

该方法必须有对应的构造方法

  1. p命名空间注入
  1. <bean id="user" class="cn.spring.entity.User" p:id="3" p:username="刘三"></bean>

基于setter注入,代表参数必须有set方法

  1.  

Spring Aop和Spring Ioc(一)的更多相关文章

  1. 【Spring AOP】Spring AOP的使用方式【Q】

    Spring AOP的三种使用方式 经典AOP使用方式 改进XML配置方式 基于注解的方式 第1种方式可以作为理解spring配置AOP的基础,是最原始的配置方式,也体现了spring处理的过程. 使 ...

  2. 【Spring AOP】Spring AOP之如何通过注解的方式实现各种通知类型的AOP操作进阶篇(3)

    一.切入点表达式的各种类型 切入点表达式的作用:限制连接点的匹配(满足时对应的aspect方法会被执行) 1)execution:用于匹配方法执行连接点.Spring AOP用户可能最经常使用exec ...

  3. 【Spring AOP】Spring AOP之你必须知道的AOP相关概念(1)

    一.什么是AOP AOP(Aspect-oriented Programming)即面向切面编程,是对OOP( Object-oriented Programming)即面向对象编程的一种补充,AOP ...

  4. Spring Aop和Spring Ioc(二)

    Spring IOC: DI注入集合类型: 实体类: package cn.spring.entity; import java.util.*; public class Dientity { pri ...

  5. Spring AOP (Spring 3.x 企业应用开发实战读书笔记第六章)

    从面相对象编程到面相切面编程,是一种代码组织方式的进化. 每一代的代码组织方式,其实是为了解决当时面对的问题.比如写编译器和写操作系统的时候的年代当然要pop,比如写界面的时候当然要oop,因为界面这 ...

  6. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

  7. Spring AOP 简介

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  8. spring AOP的学习

    1.Spring常用的概念 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点. Pointcut(切入点): ...

  9. spring AOP 之一:spring AOP功能介绍

    一.AOP简介 AOP:是一种面向切面的编程范式,是一种编程思想,旨在通过分离横切关注点,提高模块化,可以跨越对象关注点.Aop的典型应用即spring的事务机制,日志记录.利用AOP可以对业务逻辑的 ...

随机推荐

  1. HDU_1506_单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=1506 从栈底到栈顶从小到大排序,碰到比栈定小的元素,出栈处理,直到栈顶比元素小或者栈为空. 数组最后多加了个-1 ...

  2. 《N诺机试指南》(五)进制转化

    进制转化类题目类型: 代码详解及注释解答:  //进制转化问题 #include <bits/stdc++.h> using namespace std; int main(){ // 1 ...

  3. learn about sqlserver partitition and partition table --- add or remove table partitions

    demo/* add partitions */ alter database xxx add filegroup FG_=fff_201708;alter database xxx add file ...

  4. 基于 H5和 3D WebVR 的可视化虚拟现实培训系统

    前言 2019 年 VR, AR, XR, 5G, 工业互联网等名词频繁出现在我们的视野中,信息的分享与虚实的结合已经成为大势所趋,5G 是新一代信息通信技术升级的重要方向,工业互联网是制造业转型升级 ...

  5. NR / 5G - The Round Robin algorithm

  6. vi/vim编辑器操作梳理

    1. vi/vim编辑器详细使用讲解 1.1 vi/vim编辑器的3种模式 1.2 vi/vim编辑器操作说明 参数/命令/模式 说明 ###普通模式   :set nu  显示行号 :set non ...

  7. ubuntu 14.04 下安装 selenium 2.0

    文章参考出处:http://blog.sina.com.cn/s/blog_5042ea610102we4y.html 1.安装 python-pip sudo apt-get install pyt ...

  8. 仅需60秒,使用k3s创建一个多节点K8S集群!

    作者: Dawid Ziolkowski丨Container Solution云原生工程师 最近,我一直在Kubernetes上进行各种测试和部署.因此,我不得不一次又一次创建和销毁Kubernete ...

  9. codewars--js--Hamming Numbers

    问题描述: A Hamming number is a positive integer of the form 2i3j5k, for some non-negative integers i, j ...

  10. Verilog HDL学习_1:分频器/PWM的实现

    (一)参考学习资料 (二)实际操作 1. 相关变量计算:   First Initial Second Initial Upper case H X ASCII (Dec) 72 88 Lengths ...