Spring框架及AOP

Spring核心概念

  Spring框架大约由20个功能模块组成,这些模块主分为六个部分:

    Core Container :基础部分,提供了IoC特性.

    Data Access/Integration

    Web

    AOP(Aspect Orient Programming)

    Instrumentation

    Test

Spring两大核心技术

  控制反转(Inversion of Control IoC)

    称之为”依赖注入”,是面向对象编程中的一个设计理念,用来降低程序代码之间的耦合度.

    将组建对象的控制权从代码本身转移到外部容器.

  面向切面编程(AOP:Aspect Oriented Programming)

    优点

      低侵入式设计

      独立于各种应用服务器

      依赖注入特性将组建关系透明化,降低耦合度

      面向切面编程特性允许将通用任务进行集中式处理

      与第三方框架的良好整合.

SPring包下载地址

  https://repo.spring.io/webapp/#/home  进行搜索下载

Spring依赖注入(IoC)

  实现原理

  

导入相应的资源文件(Maven导入 Spring Context资源)

  <dependency>

      <groupId>org.springframework</groupId>

  <artifactId>spring-context</artifactId>

  <version>3.2.13.RELEASE</version>

  <scope>runtime</scope>

  </dependency>

配置applicationContext.xml文件

  <?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-3.0.xsd">

  <!-- 通过bean标签声明Spring对象创建的实例

id指定唯一标识符,class指定声明实例对应的类

并通过id属性为该实例指定一个名称,以便于访问 -->

<bean id="one" class="cn.springdemo.HelloSpring">

     <!-- property元素用来调用指定 name值得set方法进行赋值操         作.name的值为set方法的形参对象名 -->

<property name="who">

<!-- 此处将abc赋值给了who -->

<value>abc</value>

</property>

    //或者

<property name="who"value="abc" />

    //或者p:属性名-ref="所注如bean的ID"

    //使用有参构造方法注入

<constructor-arg name="username" value="xxx">

  </constructor-arg>

  //或者 在bear标签内写

  c:构造参数名-ref=”bean的id”构造参数名可以使用下代替,但是必须加下划线 例:c:_0,c:_1普通值直接等于即可

</bean>

<bean id="..." class="...">

<!-- 这个 bean 的合作者和配置在这里编写 -->

</bean>

<!-- 更多的 bean 定义在这里编写 -->

</beans>

在property元素中,ref属性和value属性区别

value针对常规属性赋值,如:基本数据类型,包装类,String等

ref对象赋值,赋值元素为该文件已存在的bean元素.

Bean标签常用属性

  id属性:指定唯一标识符(不能包含特殊符号),根据ID值得到配置对象

  class属性:创建对象所在类的全路径

  name属性:功能和ID属性是一样的(可以包含特殊符号)

  scope属性:singleton(默认的,单例的),prototype(多例的)

  <util:constant>; 引用某个类型的 public static 域,并将其暴露为 bean

  util:list; 创建一个 java.util.List 类型的 bean ,其中包含值或引用

  util:map; 创建一个 java.util.Map 类型的 bean ,其中包含值或引用

  util:properties; 创建一个 java.util.Properties 类型的 bean

  util:property-path; 引用一个 bean 的属性(或内嵌属性),并将其暴露为 bean

  util:set 创建一个 java.util.Set 类型的 bean ,其中包含值或引用

  注入集合类型的属性:分别使用<list>,<set>,<map>,<props>标签来实现

  注入null和空字符串:使用<null/>注入null值,使用<value></value>注入空字符串

  特殊字符的处理: <![CDATA[带特殊符号的字符串]]>

Spring注解开发准备

  1.导入基本的jar包

  

  

  2.创建类,创建方法

  3.创建Spring配置文件,引入头约束

    ioc基本功能,引入约束beans

    ioc注解开发,引入新的约束.(参考下图)

  4.开启注解扫描(一般采用第一种,多目录录入大目录即可)

     

    * 基于注解创建对象,创建对象的四个注解

      

    在类开启注解过后,创建方式跟context.xml-bean 创建对象方式一样   

    配置对象的实例为单实例还是多实例

      @Scope();默认为单例,prototype为多例 

    *  注解注入属性   

      在定义的属性上使用@Autowired注解.(使用注解不需要定义set方法),根据类型注入,找不到返回null

      @Resource注解,可根据name或type注入,找不到或找到多个则跑出异常

案例参考:

  配置xml文件,开启注解扫描

  使用xml文件配置开启注解扫描(配置Context的头文件)

    

  或:在指定包上添加@ComponentScan,则会开启扫描该类所在包及所有子包目录

    

如果JaveBean是自动创建()就则使用@Autowired进行自动获取进行注入,在参数以及方法上均可使用.

    

    

输出结果:

    

实际开发经验:

  在xml文件中创建配置对象

  使用注解插入对象

  @Configuration 注解表明该类为配置类

Spring AOP原理(面向切面编程)  

  将复杂的需求分解出不同方面,将公共功能集中解决.

  采用代理机制组装运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能.

  横向抽取机制(底层使用 动态代理方式实现)

  

  

AOP操作术语

  

  Joinpoint(连接点),类里面可以被增强的方法,在Spring中,这些方法为连接点.

  Pointcut(切入点);所谓切入点是指我们实际增强的方法.

  增强(Advice);实际增强的逻辑,称之为增强

  1. 前置增强: 在方法开始前执行
  2. 后置增强: 在方法结束后执行
  3. 异常增强: 在方法出现异常时执行
  4. 最终增强: 在后置之后执行
  5. 环绕增强: 在方法之前和之后执行

  切面(Aspect; 把增强应用到具体方法上面的过程称之为切面.

  目标对象(Target); 增强逻辑的织入目标类。

  引介(Introduction);引介是一种特殊的增强,它为类添加一些属性和方法。

  织入(Weaving); 织入是将增强添加对目标类具体连接点上的过程。

  代理(Proxy);一个类被AOP织入增强后,就产出了一个结果类,它是融合了原类和增强逻辑的代理类。

SpringAOP操作 

  在Spring实现Aop的操作,使用aspectj实现.

  @Aspectj是一个面向切面的框架(本身不是Spring自己的框架),是一个基于Java语言的框架.

  Spring2.0以后增加了对Aspectj切点表达式的支持,新版本Spring框架建议使用Aspectj方式来开发AOP.

  

  

一、基于Aspectjxml配置

  

  1.导入相关的jar包

      

  2.写增强的类以及相关的方法

  3.配置相关头文件

    

 

二、基于Aspectj的注解方式进行AOP操作

  1.导包,配置文件引入约束,创建对象

    

   2.spring核心配置文件开启aop扫描

    修改application.controller.xml文件


<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="

http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop.xsd">

<!-- 开启aop扫描操作,启用对@AspectJ注解的支持 -->

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

  

   3.在增强类上面使用注解完成aop操作    

    在增强类上添加@Aspect注解,定义为增强类

    在增强类中的方法添加注解:

      @Before(“excution表达式”)                     前置增强

      @AfterReturning(“excution表达式”)     后置增强

      @Around(“excution表达式”)                   环绕增强

      @AfterThrowing(“excution表达式”)     抛出增强

      @After       (“excution表达式”)最终final增强,不管是否有异常,都会执行.

    例:

      @Before(value=”execution(public * *(..)”)    匹配所有目标类的public方法

      如果都使用一个表达式,则可以进行提取使用@Pointcut注解进行设置

    例:

      @Pointcut(“excution表达式”)

      public void pointcut(){};

      提出来过后,在增强方法上添加注解则可以直接使用该方法即可

    例:

      @Before(“pointcut()”)

      如果增强方法中有其他参数,则也需要一起注入,非抛出异常增强使用returning=”参数对象”,表达式则放在pointcut=”excution表达式”;异常增强使用throwing=”异常参数对象”

原文地址:https://www.cnblogs.com/it-xiaoBai/p/10815158.html

时间: 2024-10-10 12:21:13

Spring框架及AOP的相关文章

java架构解密——Spring框架的AOP

一直以来,我们应用了不少的AOP框架,但是对于AOP的底层实现却没有过多的深入,古话就是"知其然,不知其所以然",随着AOP学术讨论的骤然兴起,我也开拓了自己的眼界,深入了解了AOP这个五彩斑斓的世界! 先来看看大众的定义: 百度百科: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函

Spring框架之-AOP

在工作以及面试当中Spring是必不可少的,当然了简单的认知是spring的两大特性: IOC控制翻转(也是依赖注入).AOP(面向切面) 首先什么叫aop,aop到底能做什么?大致意思是这样的 AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理.日志管理.权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性. 例如我刚才所做的日志切面,记录每次的请求和响应消息入库 我并没有像某些人把插入库的方法写在每个请求的方法里,就像上

Spring框架:AOP详解

AOP的中文名称叫做面向切面编程.这个名字非常形象,因为你真的可以把一个系统像面包一样切开,并直接在面包上增加修饰.切面可大可小,大到整个系统,小到某一个方法. AOP有什么用呢?举个例子,每个组件中都可能含有安全.事务.数据库等方面的逻辑,AOP就是把每个组件中的安全作为一个方面进行集中处理,事务作为一个方面,数据库作为一个方面等等.这样才能做到高内聚.低耦合.AOP中有三个重要的术语:通知.切点.连接点.他们之间的关系如下图. AOP实现的原理是修改目标类中的代码.至于怎么修改,有多种方式:

Spring框架学习——AOP的开发

一.AOP开发中的相关术语. ——JoinPoint(连接点):指那些可以被拦截到的点.比如增删改查方法都可以增强,这些方法就可以被称为是连接点. ——PointCut:切入点,真正被拦截的点,指对哪些连接点进行拦截的定义.JoinPoint是指方法可以增强,而切入点就是实际哪个方法进行增强或修改,这样的方法被称为切入点. ——Advice(增强/通知):方法层面的增强.指拦截到了方法后需要做的事情,也就是增强的功能部分被称为通知.分为前置(方法主体之前).后置.环绕通知. ——Introduc

Spring框架的AOP实现(JDK+CGLIB)

AOP的底层采用了代理技术,代理技术提供了两种,一种是JDK动态代理,另一种是CGLIB动态代理. 基于JDK的动态代理:必须是面向接口,只有实现了具体的接口的类才能生成代理对象. 基于CGLIB的动态代理:对于没有实现了接口的类,也可以生成代理,生成这个类的子类方式.一般如果实现接口,使用JDK动态代理完成AOP.没有实现接口,使用CGLIB动态代理实现AOP. JDK动态代理的实现 UserDao,UserDaoImpl: package com.spring.demo06; public

spring框架学习(六)AOP

spring框架学习(六)AOP AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象. AOP的引入 在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用户权限判断中,根据相应的权限执行相应的方法:在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无关,很容易忘记写,结果运行的时候就出现乱码拉.这种重复代码不仅使编码麻烦,

Spring框架AOP源码剖析

今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西的源码剖析,作为多年的开发者,想必大家在面试的时候都被问过,你知道Spring框架AOP的底层实现机制吗,这可是很简单的噢,我们会说,如果某个类有接口就使用JDK动态代理,没有接口就用CGLIB动态代理,并且Spring也提供了可配置开关,不管有无接口都一律使用CGLIB动态代理,例如 <aop:aspectj-autoproxy proxy-target-class="true"/&

spring框架之AspectJ的XML方式完成AOP的开发

1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * spring-aop-4.2.4.RELEASE.jar * com.springsource.org.aopalliance-1.0.0.jar * aspectJ的开发包 * com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar * spring

Spring框架 IOC注解

Spring框架的IOC之注解方式的快速入门        1. 步骤一:导入注解开发所有需要的jar包        * 引入IOC容器必须的6个jar包        * 多引入一个:Spring框架的AOP的jar包,spring-aop的jar包        2. 步骤二:创建对应的包结构,编写Java的类        * UserService            -- 接口        * UserServiceImpl        -- 具体的实现类        3.