zoukankan      html  css  js  c++  java
  • 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=”异常参数对象”

  • 相关阅读:
    输入流输出流
    WIN32_FIND_DATA
    typeid
    为什么要内存对齐 Data alignment: Straighten up and fly right
    fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h
    memcmp
    DPI
    英寸、 Picas、 点、 跨度和 Twips 之间的关系
    如何解决 “fatal error C1083: ”无法打开包括文件
    hdoj 1269迷宫城堡解题报告
  • 原文地址:https://www.cnblogs.com/it-xiaoBai/p/10815158.html
Copyright © 2011-2022 走看看