IOC和AOP学习

spring框架概述

  • Spring是轻量级的开源的JavaEE框架
  • Spring可以解决企业应用开发的复杂性
  • Spring有两个核心部分:IOC 和 Aop
    • IOC控制反转,把创建对象过程交给Spring进行管理
    • Aop:面向切面,不修改源代码进行功能增强
  • Spring特点:
    • 方便解耦,简化开发
    • Aop编程支持
    • 方便程序测试
    • 方便和其他框架进行整合
    • 方便进行事务操作
    • 降低API开发难度

IOC(概念和原理)

什么是IOC?

  1. 反转控制,把对象创建和对象之间的调用过程,交给Spring进行管理
  2. 使用IOC目的:为了耦合度降低

IOC过程:(降低耦合度)

// 第一步:xml配置文件,配置创建的对象
<bean id="dao" class="com.mfei.fun.UserDao"></bean>
// 第二步:有service和dao类。创建工厂类
class UserFactory {
    public static UserDao getDao() {
        String classValue - class属性值;
        Class class = Class.forName(classValue);
        return (UserDao)class.newInstance();
    }
}
IOC接口
  1. IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
  2. Spring提供IOC容器实现两种方式(两个接口)
    1. BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
      1. 加载配置文件时不会创建对象,在获取(/ 使用)对象才去创建对象
    2. ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能。
      1. 加载配置文件的时候就会把配置文件对象进行创建。
    3. 思考:哪个更好?把费时费力的操作,在启动的时候就创建好。
IOC操作 Bean管理

什么是Bean管理?(两个操作)

  • Spring创建对象
  • Spring注入属性
Bean管理操作有两种方法
  1. 基于xml配置文件方式实现

    id属性:唯一标识

    class属性:类全路径

    创建对象的时候,默认执行无参构造方法完成对象创建

    属性注入

    第一种:使用set方法

    <bean ….>

    第二种:使用有参构造注入

    1、创建有参构造器

    2、配置文件中

  2. 基于注解方式实现

IOC操作Bean管理(FactoryBean)
  1. Spring有两种类型bean,一种是普通bean,另外一种工厂bean(FactoryBean)
  2. 普通bean:在配置文件中定义bean类型就是返回类型
  3. 工厂bean:在配置文件定义bean类型可以和返回类型不一样
    1. 第一步 创建类,让这个类作为工厂bean,实现接口FactoryBean
    2. 第二步 实现接口里面的方法,在实现的方法中定义返回的类型
IOC操作Bean管理(bean作用域)
  1. 在Spring中,创建bean是单实例还是多实例

  2. 默认是单实例对象

  3. 如何设置是单实例和多实例

    1. 在Spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例

    2. scope属性值

      1. 第一个值 默认值:singleton,表示单实例对象

      2. prototype,表示是多实例对象

      3. <bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype">
            <property name="list" ref="bookList"></property>
        </bean>
        
    3. singleton和prototype区别

      1. singleton单实例,prototype多实例
      2. 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象
      3. 设置scope值是prototype时候,不是在加载spring配置文件时候创建对象,在调用getBean方法时候创建多实例对象
    4. request 一次请求(了解)

    5. session 一次对话(了解)

IOC操作Bean管理(bean生命周期)
  1. 通过构造器创建bean实例(无参构造)
  2. 为bean的属性设置值和对其他bean引用(调用set方法)
  3. 调用bean的初始化方法(需要进行配置初始化方法)
  4. bean可以使用了(对象获取到了)
  5. 当容器关闭时候,调用bean的销毁方法(需要进行配置销毁的方法)

后置方法(配置后置处理器)

IOC操作Bean管理(xml自动装配)
  1. 什么是自动装配
    1. 根据指定装配规则(属性名或者属性类型),Spring自动将匹配的属性值进行注入
  2. bean标签中有属性autowire
    1. byName 根据名称注入
    2. byType根据类型注入
IOC操作Bean管理(外部属性文件)

*引入context名称空间

IOC操作Bean管理(注解注入)
  • @Autowired:根据属性类型进行自动装配
  • @Qualifier:根据属性名称进行注入
  • @Resource:可以根据类型注入,可有根据名称注入
  • @Value:注入普通类型属性

@Configuration:作为配置类,替代xml文件

AOP(概念)

什么是aop?

面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。

image-20210919094659055

通俗描述:不通过修改源代码的方式,在主干功能中添加新功能

AOP(底层原理)
  1. AOP底层使用动态代理

    1. 第一种情况:有接口的情况,使用JDK动态代理

    2. 没有接口情况,使用CGLIB动态代理

      创建子类的代理对象,增强类的方法

    image-20210919104513623

AOP(JDK动态代理)

1、使用JDK动态代理,使用Proxy类

  • newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h) 返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。
  • 第一个参数:类加载器
  • 第二个参数:增强方法所在的类,这个类实现的接口,支持多个接口
  • 第三个参数:实现这个接口InvocationHandler,创建代理对象,写增强的方法

编写JDK动态代理代码

1、创建接口,定义方法

public interface UserDao {
    public int add(int a, int b);
    public String update(String id);
}

2、创建接口的实现类,实现方法

3、使用Proxy类创建接口的代理对象

public static void main(String[] args) {
    // 创建接口实现类代理对象
    Class[] interfaces = (UserDao.class);
    
    // 方法 匿名内部类
//    Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interface, new InvocationHandler() {
//        @Override
//        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{            
//            
//       }
//    });
    UserDaoImpl userDao = new UserDaoImpl();
    
    UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interface, new UserDaoProxy(userDao))
}

// 创建代理对象代码
class UserDaoProxy implements InvocationHandler {
    
    // 1 把创建的是谁的代理对象,把谁传递过来
    // 有参数构造器传递
    private Object obj;
    public UerDaoProxy(Object obj) {
        this.obj = obj;
    }
    
    
    
    // 增强的逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 方法之前
        System.out.println(“方法之前执行....+ method.getName() + ":传递的参数..." + Array.toString(args));
        
        // 被增强的方法执行
        Object res = method.invoke(obj,args);
        // 方法之后
         System.out.println(“方法之后执行....+ obj);
        return res;
    }
}

AOP(术语)

  1. 连接点
    1. 类里面哪些方法可以被增强,这么方法称为连接点
  2. 切入点
    1. 实际被真正增强的方法,称为切入点
  3. 通知(增强)
    1. 实际增强的逻辑部分称为通知(增强)
    2. 通知有多种类型
      1. 前置通知
      2. 后置通知
      3. 环绕通知
      4. 异常通知
      5. 最终通知
  4. 切面
    1. 把通知应用到切入点的过程
AOP操作(准备)

1、Spring框架一般都是基于AspectJ实现AOP操作

切入点表达式

1、切入点表达式的作用:知道对哪个类里面的哪个方法进行增强

2、语法结构

execution(【权限修饰符】【返回类型】【类全路径】【方法名称】(【参数列表】))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值