Spring笔记Day02

    xiaoxiao2023-09-27  20

    Spring IOC的注解 笔记

    1.@Component :组件

    修饰一个类,将这个类交给Spring管理

    @Component(“userDao”)

    //相当于

    有三个衍生注解(功能相似)

    ​ @Controller;

    ​ @Service;

    ​ @Repository;

    2.普通属性:

    ​ @value()

    3.对象类型属性:

    ​ ① @Autowired 设置对象类型的属性值,按照属性类型自动完成属性注入

    ​ 我们习惯按照名称完成属性注入必须让@Autowired和@Qualifier(value=“”)一起完成对象属性注入

    ​ ② @Resource(name="")完成对象类型的属性注入,按照名称注入(一般用这个)

    4.初始化方法和销毁方法的注解

    ​ @PostConstruct //初始化

    ​ @PreDestroy //摧毁

    5.Scope作用范围

    ​ @Scope (默认单例 -singleton)

    ​ singleton 默认单例

    ​ prototype 多例

    xml和注解开发的比较

    需要在xml中 添加context(扫描类上添加的注解)

    ​ xml适用任何场景

    ​ 结构清晰,维护方便,一目了然

    ​ 注解 如果这个类不是自己提供的就不能同注解(源码中的类) 开发编写方便

    xml和注解整合方式

    xml-bean管理类

    注解-属性注入

    AOP 面向切面编程

    AOP的本质是在一系列纵向的控制流程中,把那些相同的子流程提取成一个横向的面

    AOP 是OOP(面向对象编程)的扩展和延伸

    由AOP联盟组织提出,Spring是使用这种思想最好的框架

    AOP采用的是**横向抽取机制(代理机制)**取代了传统纵向继承

    ​ AOP可以进行*权限校验,日志记录,性能监控,事务监控*

    Spring底层的AOP实现原理 动态代理

    java的动态代理

    ​ jdk动态代理: 只能对实现接口的类产生daim

    ​ Cglib动态代理:对没有实现接口的类产生代理,生成子类

    深圳

    jdk动态代理:

    1.创建代理creatProxy()

    public UserDao creatProxy() {

    UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(

    ​ userDao.getClass().getClassLoader(), //类加载器 定义由那个类加载器加载 ​ userDao.getClass().getInterfaces(),接口 给将要代理我俩的对象提供一组什么样的接口

    ​ this //当前代理对象调用的方法);

    ​ return userDaoProxy;

    }

    **2.创建接口 —>**当前代理对象调用的方法 implements InvocationHandler

    然后在该接口的方法中执行判断是否增强需要增强的方法

    public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { ​ if(“save”.equals(arg1.getName())) { ​ //增强 ​ System.out.println(arg1.getName()+“已经增强!”); ​ return arg1.invoke(userDao, arg2); ​ }else { ​ System.out.println(arg1.getName()+“没有增强!”); ​ return arg1.invoke(userDao, arg2); ​ } ​ }

    InvocationHandler接口:proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都 有一个关联的调用处理程序;在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法。

    Proxy.newProxyInstance()方法中三个参数的解释:

    Proxy类就是用来创建一个代理对象的类,它提供了很多方法,但是我们最常用的是newProxyInstance方法。

    这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:

    ​ classloader: 定义了由哪个classloader(类加载器){当前对象的加载器}对象对生成的代理类进行加载 ​ interfaces:一个interface对象数组,{当前对象的所有接口}表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。

    ​ InvocationHandler(this):一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。

    Cglib动态代理:

    creatProxy

    1.创建cglib的核心类对象

    2.设置父类

    3.设置回调

    4.创建代理对象

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

    AspectJ是AOP的一个框架,Spring引入AspectJ最为自己的AOP开发

    SpringAOP开发方式: Spring基于AspectJ的Aop的开发

    JoinPoint:

    连接点,可以被拦截到的点(增删改成方法都可以被拦截增强—都是拦截点)

    Pointcut:方法层面的增强

    切入点,真正被拦截到的点(只对save方法进行增强)

    Advice:通知

    现在对save方法进行权限校验,权限校验的方法就是通知

    aop xml入门开发:

    1.引入所有依赖包

    2.xml配置 引用aop约束

    3.编写目标类 并在xml中配置

    4.编写切面类并交给spring管理

    5.通过配置完成对目标类产生代理

    ​ 配置 切入点方法

    ​ 配置 切面类 (通知)

    spring 中通知类型

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

    ​ 获得切入点信息

    后置通知:在之后进行操作

    ​ 获得方法的返回值

    环绕通知(事务):之前之后执行操作

    环绕通知可以阻止目标方法的执行

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

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

    Spring 切入点表达式写法:

    [访问修饰符] 方法返回参数 包名.类名.方法名(参数)

    *代表任意

    对所有DAo中save 加权限校验

    (* .DAo. *.save(…)) 通过aop 不需要修改原来的所有代码 添加删除方便

    总结以上–

    ​ Spring的IOC的注解开发

    ​ 注解的入门

    ​ 1.引入aop包

    ​ 2.引入context约束

    ​ 3.类上注解开发

    ​ <context:component-scan base-package=“com.dao,Demo2” />

    ​ 没有类上注解扫描 只用属性注入时context:annotation-config/

    ​ 4. 类注解、属性注解、scope注解的的名称

    ​ Spring xml和注解开发的正好 xml(context)

    ​ Spring aop 动态代理

    ​ Spring aop基于aspectj的xml开发

    最新回复(0)