Spring(二)

Spring的IOC的注解开发(******)

Spring的IOC的注解开发的入门

1、创建web项目,引入jar包

  • 在Spring的版本中,除了引入基本的开发包以外,还需要引入aop的包

2、引入Spring的配置文件

  • 在src下创建applicationContext.xml
    • 引入约束:使用注解开发引入context约束
    • 约束:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

3、创建接口和类

4、开启Spring的组件扫描

5、在类上添加注解

6、编写测试类

7、注解方式设置属性的值

  • 注解方式:使用注解方式,可以没有set方法的。
    • 属性如果有set方法,需要将属性注入的注解添加到set方法上。
    • 属性如果没有set方法,需要将属性注入的注解添加到属性上。

Spring的IOC的注解的详解

@Component:组件

  • 修是一个类,将这个类交给Spring管理。
  • 这个注解有三个衍生注解(功能类似),修饰类。
    • @Controller  :web层
    • @Service      :service层
    • @Repository :dao层

属性注入的注解

  • 普通属性:
    • @Value    :设置普通属性的值
  • 对象类型属性:
    • @Autowired:设置对象类型的属性的值,但是按照类型完成属性注入。
      • 我们习惯是按照名称完成属性注入:必须让@Autowired注解和@Qualifier一起使用完成按照名称属性注入。
    • @Resource:完成对象类型的属性注入,按照名称完成属性注入。

Bean的其他的注解

  • 生命周期相关的注解(了解)
    • @PostConstruct    :初始化方法
    • @PreDestroy         :销毁方法
  • Bean作用范围的注解
    • @Scope                 :作用范围
      • Singleton         :默认单例
      • prototype         :多例
      • request
      • session
      • globalsession

IOC的XML和注解开发比较

XML和注解的比较

  • 适用场景
    • XML:可以适用任何场景
      • 结构清晰,后期维护方便
    • 注解:有些地方用不了,这个类不是自己提供的
      • 开发方便

XML和注解整合开发

  • XML管理Bean,注解完成属性注入。(了解)

注意:在没有扫描的情况下,使用属性的注解:@Resource,@Value ,@Autowired,@Qualifier

           <context:annotation-config/>

Spring的AOP的XML开发(******)

AOP的概述

什么是AOP

AOP:面向切面编程,AOP是OOP的扩展和延伸,解决OOP开发遇到的问题。

Spring底层的AOP实现原理

  • 动态代理
    • JDK动态代理:只能对实现了接口的类产生代理
    • Cglib动态代理(类似于javassist第三方代理技术):对没有实现接口的类产生代理对象,生成子类对象。

JDK动态代理增强一个类中的方法:

public class MyJDKProxy implements InvocationHandler {
    private UserDao userDao;
    
    public MyJDKProxy(UserDao userDao) {
        this.userDao = userDao;
    }
    // 编写工具方法:生成代理:
    public UserDao createProxy(){
        UserDao userDaoProxy = (UserDao)  Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this);
        return userDaoProxy;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if("save".equals(method.getName())){
            System.out.println("权限校验================");
        }
        return method.invoke(userDao, args);
    }
}

Cglib动态代理增强一个类中的方法

public class MyCglibProxy implements MethodInterceptor{
    private CustomerDao customerDao;
    
    public MyCglibProxy(CustomerDao customerDao){
        this.customerDao = customerDao;
    }
    // 生成代理的方法:
    public CustomerDao createProxy(){
        // 创建 Cglib 的核心类:
        Enhancer enhancer = new Enhancer();
        // 设置父类:
        enhancer.setSuperclass(CustomerDao.class);
        // 设置回调:
        enhancer.setCallback(this);
        // 生成代理:
        CustomerDao customerDaoProxy = (CustomerDao) enhancer.create();
        return customerDaoProxy;
    }
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        if("delete".equals(method.getName())){
            Object obj = methodProxy.invokeSuper(proxy, args);
            System.out.println("日志记录================");
            return obj;
        }
        return methodProxy.invokeSuper(proxy, args);
    }
}

Spring的AOP的开发(AspectJ的XML的方式)

Spring的AOP的简介

  • AOP思想最早是由AOP联盟组织提出的,Spring是使用这种思想最好的框架。
    • Spring的AOP有自己实现的方式(非常繁琐),AspectJ是一个AOP的框架,Spring引入AspectJ作为自身AOP开发。
    • Spring两套AOP开发方式
      • Spring传统方式(弃用)。
      • Spring基于AspectJ的AOP的开发(使用)。

AOP开发中相关术语:

Joinpoint(连接点):指可以被拦截到的点(方法)。

  • 增删改查的方法都可以被增强,这些方法就可以成为是连接点。

PointCut(切入点):真正被拦截到的点。

  • 在实际开发中,只对save进行方法的增强,save称为切入点。

Advice(通知/增强):指拦截到JointPoint之后要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知。

  • 对save方法进行权限校验,权限校验的方法称为通知

Introduction(引介):类层面的增强。

Target:被增强的对象。

  • 对UserDao增强,UserDao称为是目标。

Weaving(织入):将通知(Advice)应用到目标(Target)的过程

  • 将权限校验的方法的代码应用到UserDao的save方法上的过称。

Proxy:代理对象。

AspectJ(切面):多个通知和多个切入点组合。

Spring的AOP的入门(AspectJ的XML方式)

1、创建web项目,引入jar包

  • 引入基本开发包
  • 引入aop开发的相关jar包

2、引入Spring的配置文件

  • 引入aop的约束

3、编写目标类并完成配置

4、编写测试类:

  • Spring整合Junit单元测试

5、编写一个切面类

  • 编写切面类

  • 将切面类交给Spring

6、通过AOP的配置实现

Spring中通知类型

前置通知:在目标方法执行之前进行操作

  • 获得切入点信息

后置通知:在目标方法执行之后进行操作

  • 获得方法的返回值

环绕通知:在目标方法执行之前和之后进行操作

  • 可以阻止目标方法的执行

异常抛出通知:在程序出现异常的时候,进行的操作

最终通知:无论代码是否有异常,总是会执行

Spring的切入点表达式写法:

切入点表达式语法:

  • 基于execution的函数完成的
  • 语法:
    • [访问修饰符] 方法返回值 包名.类名.方法名(参数)
      • public void com.it.spring.UserDao.save(..)
      • * *.*.*.*Dao.save()                             //所有Dao里的save都可以被增强
      • * com.it.spring.UserDao+.save()       // +代表当前的类和其子类
      • * com.it.spring..*.*(..)                         //com.it.spring包以及其子包下的所有类的所有方法都可以被增强
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值