• Java SSM(十六)——Spring查缺补漏


    iwehdio的博客园:https://www.cnblogs.com/iwehdio/

    1、IOC

    • 框架:高度抽取可重用代码,高度的通用性。多个可重用模块的集合,形成整体解决方案。
    • Spring:容器框架,简化企业级开发。
    • IOC容器可以用来整合其他框架。
    • 控制反转:
      • 控制:资源的获取方式,分为主动式(要什么资源就new一个)和被动式(资源的获取不是自己创建而是交给容器)。
      • 反转:从主动的new资源变为被动的接收资源。
    • WEB项目类路径的开始:WEB-INF/classes。
    • 普通Java项目的类路径的开始:src。
    • 对象是什么时候创建的:
      • 在创建容器完成时,容器中的对象也就被创建好了。
      • 同一个组件在IOC容器中只有一份。是单例的。
      • 获取容器中不存在的bean时,报错这个bean没有被定义。
      • xml中<property>标签对bean的赋值使用了setter方法。
    • 可以根据bean的类型从IOC中获取bean实例:
      • .getBean(Person.class)
      • 如果IOC中有多个这种类型的,该方法会报错。
      • 也可以同时传入id和类型。
    • 构造器赋值时:
      • 传入的参数必须有类型和数量相对应的构造方法。
      • 如果不指定name只写value,顺序与构造方法必须一致。或者指定index。
      • 对于参数数量相同的重载构造器,需要制定type属性为参数的类型。
    • 通过p名称空间为bean赋值:
      • 名称空间:为了防止在xml中标签重复。需要额外导包。
      • 格式:<bean p:age="18">。使用的也是setter方法。
    • 为引用类型赋值:
      • 赋值为null:在<property>标签内加入标签<null/>
      • 正常赋值:在<property>标签内写一个<bean>,内部bean可以没有id(写了也只能在内部使用)。或者写一个<ref bean=""/>
      • 赋值列表:在<property>标签内写一个<list>,在其中写内容。
    • 一个beanA引用IOC容器中的其他beanB,从beanA获取的beanB和从IOC中获取的beanB是同一个实例。而且改变其中一个对象,另一个对象也会受影响。
    • util名称空间创建集合类型的bean:
      • 格式:<util:map id="">map的内容<util:map>。id是必须的。
      • 引用该map时使用ref属性指向id。
      • 可以直接从IOC获取这个map。
      • map也可以是list等。
    • 级联属性(属性的属性)赋值:
      • 使用成员运算点 . 来指定。
      • 格式:<property name="car.price" value="">
      • 这样也会更改被引用的bean的值、
    • 通过继承实现bean配置信息的重用:
      • 使用parent属性指定当前bean的配置继承自那个bean的配置。
      • 格式:<bean parent="">,然后再指定变化了的值。可以省略class属性。
      • 这样除了指定更改的值,其他的都是相同的。
    • 通过abstract属性创建一个模板bean:
      • 格式:<bean abstract=true>
      • 这样配置的bean是抽象的,只能被继承,不能被获取实例化。
    • bean之间的依赖:
      • bean创建的顺序:在配置文件中写在前边的先创建。
      • 使用属性depends-on属性指定那几个bean先于这个bean创建。
      • 格式:<bean depends-on="">
    • 单例与多例:
      • 单例的对象,在容器启动完成前就被创建并存入容器中了。
      • 多例的对象,在容器启动时默认不会被创建。在获取时才创建。
    • 工厂模式:
      • 工厂帮我们创建对象,有一个专门为我们创建工厂的类。
      • 静态工厂:工厂本身不用创建对象,通过静态方法调用。class指定静态方法全类名,factory-method指定工厂方法,构造方法传值。
      • 实例工厂:工厂本身需要创建对象。实例工厂创建对象时用factory-bean指定使用那个工厂,factory-method指定工厂方法。
      • FactoryBean是Spring定义的一个接口。
        • 这个接口的实现类都被认为是一个工厂。Spring会自动调用工厂方法创建实例。
        • 在配置文件中注册,获取的是工厂创建的对象。
        • 不管是单例多例,都只在调用的时候才创建。
    • bean的后置处理器BeanPostProcess:
      • Spring的一个接口,可以在bean的初始化前后调用。默认bean有初始化方法。
      • 实现postProcessBeforeInitialization和postProcessAfterInitialization方法,返回bean对象到容器中。
      • 配置文件中注册后置处理器。
    • 基于xml的自动装配:
      • bean标签下的autowire属性。
      • 默认default不自动赋值,byName表示按变量名赋值,byType表示按类型赋值,constructor表示按构造器赋值。
    • SpEL表达式指定value:
      • 引用其他bean:#{其他bean的id}
      • 调用静态方法:#{T(全类名).静态方法名()}
      • 调用非静态方法:#{对象名.方法名()}
    • @Autowired原理:
      • 先看所要注入的类型是什么,按照类型从容器中找对应的组件。
      • 如果找到一个就直接赋值。如果没找到就报错。
      • 如果找到多个,再按照变量名作为id继续匹配。
      • 如果按照id还没有找到,需要使用@Qualifier注解。
      • 如果使用@Qualifier注解。还没有找到,使用required=false,找不到就注入null。
    • 方法上有@Autowired,这个方法上的每个参数都会自动注入值。
    • @Autowired@Resource的区别:
      • @Inject三个都是自动注入。
      • 前者最强大,是Spring自己的,离开Spring就无法使用。
      • 后者是java的标准,扩展性更强。
    • 泛型依赖注入:
      • 子类在继承时确定了泛型的类型,父类是带泛型的父类类型。
      • 带泛型的组件进行注入时,泛型也是组件类型的一部分。
    • IOC的代码实现:
      • IOC是一个容器,启动时创建所有单实例对象,可以直接从容器获取到这些对象。
      • IOC容器的启动过程:
        • 调用ClassPathXMLApplicationContext的构造器。
        • 该构造方法中调用refresh()方法。
        • 该方法中创建beanFactory,解析XML文件中的配置。
        • 调用方法finishBeanFactoryInitialization()创建所有非延迟加载的单实例的bean。
        • 该方法中perInstantiateSingletons()创建单实例bean。
        • 该方法中获取所有bean的名称,按顺序循环创建bean。
        • 判断bean是工厂bean还是普通bean。getbean()方法创建bean对象。
        • 该方法中调用doGetBean()方法。
        • 该方法中调用getSingleton()方法。
        • 该方法中调用singletonFactory.getObject()通过反射创建对象。
        • 创建对象把对象放入一个map中。
      • BeanFactory与ApplicationContext的区别:
        • ApplicationContext是BeanFactory的子接口。
        • BeanFactory是bean工厂接口,负责创建bean实例,容器里的单例bean实际上是一个map。是Spring最底层的接口。
        • ApplicationContext是容器接口,更多的负责容器功能的实现,容器可以从map中获取bean。AOP和依赖注入都在这个接口下实现。是Spring提供给用户的接口。

    2、AOP

    • 面向切面编程:在程序运行期间,将某段代码动态的切入到指定方法的指定位置进行运行的编程方式。
    • AOP初级配置:
      • 将目标类和切面类加入IOC容器。
      • 切面类加入@Aspect注解。
      • 在切面类的方法上加@Befored等注解,并加入切入点表达式。
    • AOP的实现:动态代理的嵌套。
    • AOP细节:
      1. IOC容器中保存的是组件的代理对象。
      2. 切入点表达式的通配写法。
      3. 通知方法的执行顺序。前置-后置-返回/异常。
      4. 通知方法运行时,可以拿到目标方法的详细信息。在通知方法的参数列表上写JointPoint joinPoint。使用.getArgs()获取方法参数。.getSignature()获取方法签名。
      5. @Befored等注解中用returning和throwing属性来告诉Spring参数列表中的那个参数用来接收返回值和异常信息。
      6. Spring对通知方法的唯一要求是参数列表一定要正确。
      7. 注解配置时,环绕通知的各个通知都在普通通知之前运行。环绕通知捕获异常则普通通知感受不到异常。环绕通知抛出异常则普通通知可以感受到异常。
      8. 多切面运行顺序:切面1前置-切面2前置-方法运行-切面2返回-切面2后置-切面1返回-切面1后置。注解配置时,那个切面在前是按切面类首字母顺序,也可以用@Order指定顺序。
      9. 在xml配置时,通知顺序与文件中配置的先后有关。也可以在<aop:aspect>中指定order属性。
    • ${}取出配置文件中的值(<context:property-placeholder>标签导入),#{}是SpEL表达式。
    • jdbcTemplate的批量插入:.batchUpdate(sql,List<Object[]>),第二个参数中列表中的每个元素就是一组输入的参数。
    • SQL中的具名参数:参数不是占位符?而是一个变量名。
      • 格式:在SQL语句中:参数名
      • 需要使用类NameedParameterJdbcTemolate的update方法。
      • 传入的第二个参数是一个参数map,键为参数名。
      • 也可以传入一个bean对象,bean的属性值与参数名对应。
    • 声明式事务:
      • 与之对应的是编程式事务,通过编写过滤器实现。
      • 声明式是指只需要告诉Spring那个方法是事务方法即可。不需要编写代码。
      • 事务管理的模式式固定的,可以通过AOP的横切关注点实现。这个已经变写好的切面就是事务管理器。
      • 配置声明式事务:
        1. 在配置文件中配置事务管理器。
        2. 开启基于注解的事务控制。
        3. 加上@Transactional注解。
    • 声明式事务细节:
      1. @Transactional注解的属性。隔离级别、传播行为、只读、超时、那些异常不回滚、那些异常回滚。
      2. 运行时异常,默认都回滚。编译时异常,默认不回滚。
      3. 事务的隔离级别isolation:读未提交、读已提交、可重复读和串行化。
      4. 并发修改同一个数据会排队,等第一个事务提交后第二个才会修改。
      5. 传播行为:如果有多个事务嵌套运行,子事务是否要和大事务共用一个事务。即事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
      6. 传播行为主要包括在当前事务内运行(REQUIRED)或重新创建一个事务(REQUIRES_NEW,如果已经有事务就挂起)等。
      7. REQUIRED的子事务,事务属性来源于大事务。
      8. 本类事务方法之间的调用只会产生一个事务。因为只创建了一个代理对象。
      9. IOC容器中保存的是有事务的业务逻辑组件的代理对象。
      10. 加在类上的@Transactional注解就表示下边的所有方法都被事务控制,但是方法上再写@Transactional配置会覆盖类上的设置。

    iwehdio的博客园:https://www.cnblogs.com/iwehdio/
  • 相关阅读:
    明星球队的傲慢
    VS2010测试方面的文章重点
    项目管理有感
    团队从小到大,再到体验团队
    css实现文字渐变
    echarts坐标轴文字过长省略
    mustache+mock
    你有选择的权利
    呵呵,初学者小编
    Centos7升级到OpenSSH_8.8p1、OpenSSL 1.1.1l版本
  • 原文地址:https://www.cnblogs.com/iwehdio/p/13336456.html
Copyright © 2020-2023  润新知