.Net转Java自学之路—Spring框架篇二(IOC注解、AOP)

Spring的Bean操做(注解方式):spring

  注解:代码中特殊的标记,使用注解能够完成相关功能。
    @注解名称(属性名称=属性值)
    注解可使用在类、方法、属性上面。
  主要用途:能够替代配置文件来建立对象和属性注入。express

  在作ioc基本功能时,配置文件引入的schema约束为beans约束,而在作spring的ioc注解开发,引入新schema约束的context约束。编程

<?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"
       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">

</beans>

  引入约束后,注解方式还须要在配置文件中开启注解扫描:缓存

<!-- 开启注解扫描:该配置扫描包中的类、方法、属性上是否有注解 -->
<context:component-scan base-package="包名"></context:component-scan>

<!-- 该配置只扫描属性上是否有注解 -->
<context:annotation-config></context:annotation-config>

  使用注解建立对象:在建立的类上方使用注解便可。安全

/**
*  该注解中的value="test"至关于配置文件中的<bean id="test"......
*/
@Component(value="test")
public class Test{
}

  建立对象含有四种注解方式:框架

    四个注解的目前功能都是同样的。Spring种提供@Component的三个衍生注解:
      @Controller:wen层  @Service:业务层  @Repository:持久层
      该三种注解方式时为了让标注类自己的用途清晰。Spring后续版本会对其加强。性能

    @Scope(Value="prototype"):多实例;做用范围。spa

@Component(value="test")
@Scope(value="singleton")//单实例的
public class Test{

}

  使用注解注入属性:prototype

    使用注解方式的属性注入时不须要set方法,而是在须要注入的属性上方使用注解@Autowired便可。代理

    除去@Autowired注解外还有另外一种注解方式:@Resource(name="指定注解类种的value值")

  XML和注解方式混合使用:

    建立对象操做使用配置文件方式实现。
    注入属性的操做使用注解方式实现。

AOP:

  面向切面编程。扩展功能不修改源代码实现。AOP采起横向抽取机制,取代了传统的纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)

  aop操做相关术语:

    Joinpoint(链接点):指那些被拦截到的点。在Spring中,这些点指的时方法,由于Spring只支持方法类型的链接点。
      简述:指类中那些方法能够被加强,这些方法称为链接点。

    Pointcut(切入点):指要对那些Joinpoint进行拦截的定义。
      简述:指在类中能够有不少的方法被加强,实际加强的方法称为切入点。

    Advice(通知/加强):加强的逻辑称为加强。所谓通知是指拦截到Joinpoint以后所要作的事情就是通知,通知分为:
      前置通知:在方法以前执行。
      后置通知:在方法以后执行。
      异常通知:方法出现异常。
      最终通知:在后置以后执行。
      环绕通知(切面要完成的功能):在方法以前和以后执行。

    Aspect(切面):是切入点和通知(引介)的结合。
      简述:把加强应用到具体方法上,就是把加强用到切入点的过程称为切面。

    Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction能够在运行期为类动态的添加一些方法或Field。

    Target(目标对象):代理的目标对象(要加强的类)。

    Weaving(织入):是把加强应用到目标的过程。把advice应用到target的过程。

    Proxy(代理):一个类被AOP织入加强后,就产生一个结果代理类。

  Spring基于aspectj的xml方式的AOP操做:

    在Spring中进行aop操做,须要使用aspectj来实现。aspectj是一个面向切面的框架,是一个基于Java语言的aop框架。
    aspectj不是Spring的一部分,和Spring一块儿使用进行aop操做。Spring2.0以后新增了对aspectj支持。

    使用aspectj来实现aop有两种方式:一、基于aspectj的XML配置。二、基于aspectj的注解方式。

    AOP操做准备:

      一、除去导入基本的jar包以外,还须要导入aop相关的jar包:
        aopalliance.jar、aspectjweaver.jar、spring-aop.RELEASE.jar、spring-aspects.RELEASE.jar

      二、建立Spring核心配置文件。须要导入aop约束。

<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>

  使用表达式配置切入点:

    一、切入点:实际加强的方法。

    二、经常使用表达式格式:execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
      例:execution(* 加强方法的全路径(..))    *:任意的修饰符
        execution(* cn.test.aop.Test.*(..))    类.*:对类中的全部方法加强
        execution(* *.*(..))          *.*:对全部类中的全部方法进行加强
        execution(* save*(..))        save*:匹配全部save开头的方法进行加强

<!-- 配置对象 -->
<bean id="test" class="Test全路径"></bean>
<bean id="zqtest" class="ZQTest全路径"></bean>
<!-- 配置aop操做 -->
<aop:config>
    <!-- 配置切入点 -->
    <!-- 对Test类中全部方法进行加强 -->
    <aop:pointcut expression="execution(* Test全路径.*(..))" id="pc1"></aop:pointcut>
    <!-- 配置切面 -->
    <!-- 把加强用到方法上 -->
    <aop:aspect ref="zqtest">
        <!-- 配置加强类型
            method:加强类中使用那个方法做为前置执行
            pointcut-ref:做用在那个切入点上,
                对应配置切入点的id值-->
        <aop:before method="方法名" pointcut-ref="pc1"/>
        <!-- 后置执行 -->
        <aop:after-returning method="方法名" pointcut-ref="pc1"/>
        <!-- 环绕执行
            在环绕方法中用
            ProceedingJoinPoint.proceed()
            来执行被加强的方法-->
        <aop:around method="环绕方法名" pointcut-ref="pc1">
    </aop:aspect>
</aop:config>

  基于aspectj的注解aop操做:

    使用注解方式实现aop操做:先建立对象,而后开启AOP操做。在加强类上使用注解完成aop操做;并在加强的方法上使用注解完成加强配置。

<!-- 配置对象 -->
<bean id="test" class="Test全路径"></bean>
<bean id="zqtest" class="ZQTest全路径"></bean>
<!-- 开启aop操做 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect
public class ZQTest{
    //在方法上使用注解完成加强配置
    @Before(value="execution(* Test类全路径.*(..))")
    public void fun(){
    }
}
相关文章
相关标签/搜索