spring入门aop和ioc

文章目录

    • spring分层架构
      • 表现层
      • 服务层(业务层)
      • 持久层
    • spring核心
      • ioc(控制反转)
        • 1)**接下来是代码示例:**
        • 2)**ioc容器的使用过程**
        • 3)ioc中的bean管理
        • 4)实例化bean的三种方式
      • aop(面向切面开发)
    • 定义
    • 优势
    • AOP底层原理
    • AOP相关的术语
    • AOP入门
    • aop注解开发
    • aop纯注解开发
      • Di(依赖注入)
        • 1)属性的set方法注入值的方式
        • 2)构造方法赋值的方法
      • 多配置文件
      • 多配置文件

spring分层架构

  1. 表现层

    springmvc

  2. 服务层(业务层)

    spring ioc

  3. 持久层

    mybatis

    mybatis plus

    hibernite

互联网项目,多ssm结构

spring核心

  1. ioc(控制反转)

    ioc将对象的创建权利交给spring框架,底层实际上是使用反射实现的。降低程序的耦合度

    1)接下来是代码示例:
    1. 创建一个空的maven项目

    2. 引入一些基本依赖

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
    
    1. 准备实体类

      // 创建一个接口
      public interface UserService {public void hello();
      }
      // 创建一个实体类
      public class UserServiceImpl implements UserService {@Overridepublic void hello() {System.out.println("Hello, world!");}
      }
    2. 准备配置文件

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="us" class="实体类的路径"></bean>
      </beans>
      
    3. 在test中测试

      // 常规方法@Testpublic void testUser() {// TODO: write test cases for UserServiceUserService userService = new UserServiceImpl();userService.hello();}
      // 基于ioc容器管理的方法,ioc是一个map key是对象的标识,value是ioc创建的对象@Testpublic void run1() {// 创建spring ioc工厂ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取beanUserService userService = (UserService) ac.getBean("us");userService.hello();}
      

    上面就是一个关于ioc容器的示例

    2)ioc容器的使用过程

    ApplicationContext接口,这个工厂接口,使用这个接口就可以获得相应的Bean对象,该对象下有两个实现类

    1. ClassPathXmlApplicationContext:加载类路径下的spring配置文件(常用)
    2. FileSystemXmlApplicationContext:加载本地磁盘下的spring配置文件(让项目和配置文件分离管理,不常用)
    3)ioc中的bean管理
    1. id属性:bean的别名,取名要求:必须要字母开头,可以使用数字,连字符,下划线,字母,不能出现特殊字符
    2. class属性:bean对象的全路径
    3. scope属性: bean对象的作用范围
      1. singleton:单例(默认)生命周期和配置文件一样
      2. prototype:多例,不是加载配置文件时创建,而是在获取实例对象时创建
      3. request: 多例,不常用,应用于web项目中,每个请求都会创建一个新的实例对象
      4. session:多例,不常用,应用于web项目中,向一个http session中共享一个实例
    4. init-method:bean对象创建时可以配置一个指定的方法自动调用
    5. destory-method:bean对象销毁时可以配置一个指定的方并自动调用
    4)实例化bean的三种方式
    1. 默认是无参的构造方法

          <bean id="us" class="实体类的路径"></bean>
      
    2. 静态工厂实例化方法(好处是可以自己编写业务逻辑)

      准备一个静态工厂类

      public class StaticFactory {public static UserService createUser() {// 编写业务逻辑// ......return new UserServiceImpl();}
      }
      

      在xml配置文件中使用

          <bean id="us1" class="com.qc.util.StaticFactory" factory-method="createUser"></bean>
      
    3. 实例化工厂实例化方式

      准备一个可以实例化的类

      public class DFactory {public  UserService createUser() {// 编写业务逻辑return new UserServiceImpl();}
      }
      

      在xml配置文件中使用

          <bean id="factory" class="com.qc.util.DFactory"></bean><bean id="us2" factory-bean="factory" factory-method="createUser"></bean>
      
  2. aop(面向切面开发)

    定义

    是一种编辑的范式,是OOP的延续,也是Spring框架中函数编程的一种衍生范式,利用AOP可以对业务的各个部分进行隔离,从而似的业务逻辑各部分之间的耦合度降低,提高了程序的重用性,同时提高了开发的效率,AOP采用横向抽取机制,取代了传统纵向继承体系。

    优势

    1. 运行期间,不修改源代码的情况下,对已有的方法进行增强,减少重复代码
    2. 提高开发效率
    3. 方便维护

    AOP底层原理

    1. 如果使用接口,则使用JDK动态代理技术,如果没有使用接口,使用的是继承则是cglib代理

    AOP相关的术语

    1. Joinpoint(连接点)所谓连接点是指那些被连接到的点,在spring中,这些带点指的是方法,因为spring只支持方法类型的节点
    2. Pointcut(切入点)所谓切入点是我们要对哪些Joinpoint进行拦截的定义
    3. Advice(通知\通知)所谓通知就是指,拦截到Joinpoint之后所要做的情况就就是通知,通知分为,前置通知,后置通知,异常通知,最终通知,环绕通知(切面类中要完成的功能)
    4. Target(目标对象)代理的目标对象
    5. Weaving(织入)是指把增强应用到目标对象来创建新的代理对象的过程
    6. Proxy(代理)一个类被AOP织入增强后,就产生一个结果代理类
    7. Aspect(切面)是切入点+通知的结合,是自己编写和配置

    AOP入门

    1. 导入坐标依赖

      <dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>
      
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd">
      </beans>
      
    2. 编写spirng配置文件中AOP的配置部分

          <!--    bean管理--><bean id="us" class="com.qc.service.impl.UserServiceImpl"/><bean id="myAspect" class="com.qc.util.MyAspect"/><!--    配置aop--><aop:config><!--        配置切面--><aop:aspect ref="myAspect"><!--            前缀通知--><aop:before method="log1" pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!--            后置通知--><aop:after-returning method="log2"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!--            异常通知--><aop:after-throwing method="log3"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!--            最终通知--><aop:after method="log4"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!--            环绕通知--><aop:around method="aroundLog"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/></aop:aspect></aop:config>
      
      import org.aspectj.lang.ProceedingJoinPoint;public class MyAspect {// 自定义切面类 = 切入点+通知//通知public void log1() {System.out.println("前置增强的");}public void log2() {System.out.println("后置增强的");}public void log3() {System.out.println("异常增强的");}public void log4() {System.out.println("最终增强的");}public void aroundLog(ProceedingJoinPoint point) {try {log1();point.proceed(); // 目标方法调用log2();} catch (Throwable e) {e.printStackTrace();log3();} finally {log4();}}
      }
      

      注意环绕通知使用的接口

    通知类型

    1. 前置通知:目标方法执行前进行增强
    2. 后置通知:目标方法执行后进行增强
    3. 异常通知:目标方法出现异常后进行增强
    4. 最终通知:目标方法无论是否异常都进行增强
    5. 环绕通知:目标方法执行前后,都进行增强,不过需要自己书写

    切入点表达式

    • execution([修饰符] 返回值 包名.类名.方法名(参数))
    • 修饰符可以省略不写
    • 返回值类型不能省略,根据方法来编写返回值,可以用星号来代替
    • 包名类型方法名是不能省略的,但是可以用星号来代替,也可以部分代替
    • 参数如果是一个可以用星号来代替,如果是多个可以使用两个点

    因此比较通用的表达式:

    execution( com.qc.*.Service.save(…))

    aop注解开发

    给切面添加@Aspect,编写增强的方法,使用通知类型注解声明

        <!--    开启注解扫描--><context:component-scan base-package="com.qc"/><!--    开启自动代理--><aop:aspectj-autoproxy/>
    
    @Aspect
    @Component
    public class MyAspect {// 自定义切面类 = 切入点+通知//通知@Before("execution(* com.qc.*.*.*ServiceImpl.save(..))")public void log1() {System.out.println("前置增强的");}@AfterReturning("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log2() {System.out.println("后置增强的");}@AfterThrowing("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log3() {System.out.println("异常增强的");}@After("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log4() {System.out.println("最终增强的");}@Around("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void aroundLog(ProceedingJoinPoint point) {try {log1();point.proceed(); // 目标方法调用log2();} catch (Throwable e) {e.printStackTrace();log3();} finally {log4();}}
    }
    

    在每个方法上使用注解进行配置,和配置文件类似

    通知类型注解:

    1. @Before 前置注解
    2. @AfterReturning 后置注解
    3. @AfterThrowing 异常注解
    4. @After 最终注解
    5. @Round 环绕注解

    注意:在配置文件中开启自动代理

    aop纯注解开发

    @EnableAspectJAutoProxy 开启自动代理

  3. Di(依赖注入)

    依赖注入:在spring框架负责创建bean对象时,动态的将对象注入到其他的bean对象中

    1)属性的set方法注入值的方式
    1. 声明变量并在需要依赖注入的地方设置set方法

    2. 在xml文件中配置该变量的值

          <bean id="us" class="com.qc.service.impl.UserServiceImpl"><property name="userDao" ref=""></property><property name="name" value=""></property></bean>
      

      参数说明:如果property中的是一个简单类型(基本类型和字符串),那么就使用value,否则就使用ref

    2)构造方法赋值的方法
    1. 在需要的地方添加构造方法

    2. 在配置文件中使用带参数的构造方法传参

          <bean id="userDao" class="com.qc.dao.impl.UserDaoImpl"></bean><bean id="us" class="com.qc.service.impl.UserServiceImpl"><constructor-arg name="userDao" ref="userDao"></constructor-arg></bean>
      
    3. 其他类型的参数传参

      准备一个java类

      public class CollectionBean {private String[] strs;private List<String> list;private Map<String, String> map;private Properties properties;public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public String[] getStrs() {return strs;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public CollectionBean() {}public void setStrs(String[] strs) {this.strs = strs;}public CollectionBean(String[] strs) {this.strs = strs;}
      }
      
      1. 不可变数组

        <bean id="co" class="com.qc.service.CollectionBean"><property name="strs"><array><value>小美</value><value>小张</value><value>小王</value></array></property></bean>
        
      2. 可变集合

            <bean id="co" class="com.qc.service.CollectionBean"><property name="list"><list><value>张三</value><value>李四</value><value>王五</value></list></property></bean>
        
      3. map集合

        <bean id="co" class="com.qc.service.CollectionBean"><property name="map"><map><entry key="name" value="zhangsan"></entry><entry key="age" value="18"></entry></map></property></bean>
        
      4. 其他类型

          <bean id="co" class="com.qc.service.CollectionBean"><property name="properties"><props><prop key="username">zhangsan</prop><prop key="password">1234</prop></props></property></bean>
        
  4. 多配置文件

    1. 在配置文件中使用

      <import resource="applicationContext.xml"></import>
      
    2. 创建工厂时直接加载多个配置文件

              ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");
      

                <props><prop key="username">zhangsan</prop><prop key="password">1234</prop></props></property></bean>```
  1. 多配置文件

    1. 在配置文件中使用

      <import resource="applicationContext.xml"></import>
      
    2. 创建工厂时直接加载多个配置文件

              ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法笔记:基础篇 - 数组:为什么数组都是从0开始编号

概述 提到数组&#xff0c;大家应该都不陌生。每一种编程语言基本都会有数组这种数据类型。不过&#xff0c;它不仅仅是一种编程语言中的数据类型&#xff0c;还是一种基础的数据结构。尽管数组看起来非常简单&#xff0c;但是我估计很多人并没有理解这个数据结构的精髓。 在…

AB测试实战

AB测试实战 1、AB测试介绍&#x1f43e; 很多网站/APP的首页都会挂一张头图(Banner)&#xff0c;用来展示重要信息&#xff0c;头图是否吸引人会对公司的营收带来重大影响&#xff0c;一家寿险公司Humana设计了如下三张头图&#xff0c;现在需要决定使用哪一张放到首页&#x…

FastDFS分布式文件系统

一、概述 FastDFS是一款由国人余庆开发的轻量级开源分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文件访问&#xff08;文件上传、文件下载&#xff09;等&#xff0c;主要解决大容量文件存储和高并发访问问题&#xff0c…

jenkins应用2-freestyle-job

1.jenkins应用 1.jenkins构建的流程 1.使用git参数化构建&#xff0c;用标签区分版本 2.git 拉取gitlab远程仓库代码 3.maven打包项目 4.sonarqube经行代码质量检测 5.自定义制作镜像发送到远程仓库harbor 6.在远程服务器上拉取代码启动容器 这个是构建的整个过程和步骤…

保姆级教程:Redis 主从复制原理及集群搭建

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

线程池的工作原理

文章目录 一、应用场景二、工作原理三、主要函数 一、应用场景 传统并发变成的缺陷&#xff1a; 1.创建和销毁线程上花费的时间和消耗的系统资源&#xff0c;甚至可能要比花在处理实际的用户请求的时间和资源要多得多 2. 活动的线程需要消耗系统资源&#xff0c;如果启动太多&…

Python基础教程教材:从入门到精通的全方位解析

Python基础教程教材&#xff1a;从入门到精通的全方位解析 Python&#xff0c;作为一门强大的编程语言&#xff0c;正日益受到全球开发者的青睐。无论是数据分析、人工智能还是Web开发&#xff0c;Python都展现出其独特的魅力。然而&#xff0c;对于初学者来说&#xff0c;如何…

新规:互联网政务应用安全管理规定将于7月1日正式执行

随着互联网技术的快速发展&#xff0c;政务服务也逐渐向数字化、智能化、便捷化转型。为了保障互联网政务应用的安全&#xff0c;保障公民信息不被泄露&#xff0c;为了让大家放心&#xff0c;我国政府出台了互联网政务应用安全管理规定。此规定将于24年7月1日正式执行。 1、规…

安卓自动化之minicap截图

安卓自动化之minicap截图 关于安卓自动化使用找图方法点击时&#xff0c;最大的痛点是使用原生adb截图速度太慢了&#xff0c;大概需要3s的时间&#xff0c;再加上我们使用opencv的找图算法&#xff0c;时间就去都三秒多了&#xff0c;为了解决这一个痛点&#xff0c;我们就可…

HBase数据库面试知识点:第二部分 - 核心技术(持续更新中)

目录 1. 分布式存储与HDFS 2. 面向列的存储 3. 数据版本控制 4. Region与RegionServer 5. 分布式协调服务&#xff08;ZooKeeper&#xff09; 1. 分布式存储与HDFS HBase利用Hadoop的HDFS作为其底层存储系统&#xff0c;确保数据的高可靠性和可扩展性。 数据块&#xff0…

Python爬虫如何入门:一步步走向精通的指南

Python爬虫如何入门&#xff1a;一步步走向精通的指南 在信息爆炸的时代&#xff0c;爬虫技术已经成为获取、整理和分析数据的必备技能。Python&#xff0c;以其简洁易懂的语法和强大的库支持&#xff0c;成为了爬虫开发的热门语言。那么&#xff0c;如何入门Python爬虫呢&…

研发质量测试工程师的笔试题

研发质量测试工程师的笔试题通常会考察候选人在测试理论、测试方法、测试工具使用以及实际案例分析等方面的知识和能力。以下是一些可能出现在研发质量测试工程师笔试中的题目类型和内容&#xff1a; 一、测试理论题 请简述软件测试的目的和基本原则。描述黑盒测试和白盒测试…

Python | 句子缩写

字符串大小的比较Unicode码值 类似于asc|| 码 小写字母从 a 到 z 对应的 Unicode 码值是从 97 到 122&#xff0c;而大写字母从 A 到 Z 对应的 Unicode 码值是从 65 到 90, 大小写字母之间的差值为32&#xff0c;所以可以通过数学运算将小写字符减去32后转换为大写字符。 字…

26、matlab多项式曲线拟合:polyfit ()函数

1、polyfit 多项式曲线拟合 语法 语法&#xff1a;p polyfit(x,y,n) 返回次数为 n 的多项式 p(x) 的系数&#xff0c;该阶数是 y 中数据的最佳拟合&#xff08;基于最小二乘指标&#xff09;。 语法&#xff1a;[p,S] polyfit(x,y,n) 还返回一个结构体 S 语法&#xff1a;[…

优化 mac 储存空间的方法 只需一招为你的苹果电脑提速

在职场中&#xff0c;许多人都对苹果电脑情有独钟。苹果电脑以其简洁美观的设计、流畅稳定的性能以及出色的用户体验&#xff0c;成为了众多职场人士的得力助手。无论是处理文档、制作演示文稿&#xff0c;还是进行创意设计等工作&#xff0c;苹果电脑都能展现出其独特的优势&a…

微信小程序公众号二合一分销商城源码系统 基于PHP+MySQL组合开发的 可多商户商家入驻 带完整的安装代码包以及搭建教程

系统概述 微信小程序公众号二合一分销商城源码系统&#xff0c;是基于PHPMySQL组合开发的一款高效、稳定的电子商务平台解决方案。该系统创新性地将微信公众号与小程序的功能进行了深度整合&#xff0c;为商家提供了一个功能齐全、易于管理的分销商城系统。通过此系统&#xf…

Vue3+vant 带你实现常见的历史记录的业务功能

前言 大部分小伙伴不管是开发PC端还是H5移动端&#xff0c;都会遇到历史搜索的功能。对用户的历史记录进行增删查可以是接口&#xff0c;也可以是前端用缓存实现&#xff0c;一般用浏览器缓存实现的比较多&#xff0c;这篇文章就来教你如何用LocalStorage对历史记录数据的存储、…

视创云展元宇宙虚拟展厅,带来沉浸式的逛展体验!

近年来&#xff0c;随着科技的飞速发展和市场需求的不断演变&#xff0c;众多企业纷纷将目光转向线上虚拟展厅的建设。视创云展元宇宙虚拟展厅凭借其创新性和实用性&#xff0c;为众多企业带来了前所未有的宣传体验&#xff0c;成为了商企展示自我、推广产品的全新舞台。 与传统…

Java 生成SSL证书

第一步&#xff1a; cmd打开指令窗口 第二步&#xff1a; 运行指令&#xff1a; keytool -keystore hk.jks -storepass 123456 -deststoretype jks -genkeypair -keyalg RSA -validity 365 -alias contrastserver -dname "CN111.230.63.59, OUHK, OHK, LZH, STGD, CCN&…

XSKY对象存储深度结合Alluxio分布式缓存系统,GPU利用率提高至90%以上

近日&#xff0c;Alluxio分布式缓存系统完成了与XSKY星辰天合的 XEOS V6.4 对象存储的兼容性测试&#xff0c;旨在解决数据管理和加速方面的挑战。双方进行了深度的产品对接和联合开发&#xff0c;将 Alluxio 分布式缓存系统与 XEOS 对象存储的众多应用特性进行结合&#xff0c…