spring-Ioc

java的jar包搜索网址:http://maven.outofmemory.cn/search/?

================================================================

一、常用的几种模式介绍:

  —— 代理模式原理:存在target类,希望临时增强某些方法。此时使用resource类帮助target增强指定的功能。

     1、静态代理:实用组合的方式,资源类将目标类定义为属性,然后在资源类内部进行增强。

    2、动态代理:

      》jdk的动态代理,使用Proxy类实现代理功能。实质上Proxy动态代理的底层实现是静态代理机制。

         >要求:目标类必须实现对应的接口

    3、CGLIB动态代理:CGLIB是一个轻量级框架,使用时需要导入外部jar包。全称为code generation library。核心是通过Enhance获得子类的增强对象,其中使用了回调方法。

         >要求:目标对象必须是可继承的

  —— 适配器模式:将现有的接口转换为用户需要的接口,此处的接口指的是符合某类标准的集合。同时起到对不同的接口统一管理的目的。

    1、类适配器:继承+接口实现。适配器类继承源类(拥有目标类需要的实现),并且实现核心接口。

    2、对象适配器:适配器类在内部保存源类实列,并继承核心接口。感觉与静态代理非常相似。

    3、接口适配器:使用抽象类实现接口。避免了每次使用接口时需要覆写接口中的全部方法。

    4、适配器管理器:适配器之间形成上下级的管理层次。顶层适配器可以使用Object参数接收外部参数,然后内部通过判断再转型为特定的对象。

        》应用场景:适配器管理器+假设法框架搭建。假设法框架搭建及自顶向下完成逻辑的实现,当遇到问题时,我们假设存在某个方法可以支持当前问题的解决,然后再进行具体的实现。适配器模式还可以用于系统的升级。

  —— 装饰者模式:在动态运行的过程中,对目标对象进行增强

     1、实现方式:增强对象继承自目标对象,并且在内部声明有目标类型的变量,当在运行的过程中想要增强爱那个目标对象,需要将目标对象传入增强对象。最后返回增强对象给外部调用者。

  —— 模板设计者模式:预先定义一个算法的框架,将变动的步骤延迟执行。

    1、优点:利于子类在不改变算法框架的前提下,进行个性化定义。

    2、组成:存在一个父类,父类中父类中包含模板方法和步骤方法。模板方法为实现某种算法的步骤,子类不能改变。步骤方法为实现模板方法各阶段的具体细节。

        》步骤方法的分类:抽象方法(自类必须实现),最终方法(子类不能改动),钩子方法(父类给出的默认方法,子类可以选择性的实现)

二、java日志模块:Log4j与Log4j2。全称为Log for java,专门用于java语言的日志记录。

  1、之日信息分类:调试日志,运行日志,异常日志。

  2、日志级别:fatal、error、wran、infor、debug、trace(等级由高到低)

  3、log4j与log4j2的区别:log4j使用后缀名为properties的配置文件;log4j2使用后缀名为xml的配置文件

!因为没有找到配置文件,所以目前我还没有使用过。

 

三、spring的Ioc:Ioc全称为nversion of controller,即控制反转。用于解决主业务之间的耦合度。

  ——依赖查找:dependency lookup,是一个容器,由容器提供回调接口和上下环境,逻辑代码提供具体的查找方式。典型的依赖查找是JNDI。

  ——依赖注入:dependency injection。逻辑代码不做查询,由容器自动完成。由外部容器创建对象后再传递给程序。

  ——POJO:全称为 plain ordinary java object,即普通javaBean。使用了pojo,程序的移植性会很强,因为不需要依赖jdk以外的jar包。

  1、spring容器的介绍:

      》ApplicationContext容器:在初始化容器的时候,便会创建容器中的对象,在获取指定对象时较快。但是浪费资源

      》BeanFactory容器:在初始化容器时没有创建容器中的对象,只有当外不需要时才立刻进行创建。对象获取慢,但是相对节约资源。

  2、spring配置文件的搜索:

      》ClassPathApplicationContext():在src路径下开始查找。

      》FileSystemXmlApplicaitonContext():在指定的路径下开始查找,即配置文件可以存在于项目外。

  3、sping的Bean的装配:

      》默认装配:Bean需要拥有无参构造。因为底层的反射调用需要使用到无参构造。

      》动态工厂Bean,通过工厂创建和返回需要的Bean,在配置文件中将工厂类与实体类进行联动注册。实体类在配置时使用

<bean id="factory" class="cn.yrc.factory.FactoryBean"></bean>
       <bean id="myService" factory-bean="factory" factory-method="getSomeService"></bean>

  

      》静态工厂Bean,由工厂创建Bean,并由工厂的静态方法返回实体类。

<bean id="myService" class="cn.yrc.factory.FactoryBean" factory-method="getSomeService"></bean>

  4、bean的作用域:scope

       》prototype:原型模式,是在程序代码中访问时才创建Bean对象。

      》singleton:单列模式:容器初始化时创建。容器通常默认bean对象是单态的。

      》request:每次http请求都会产生不同的Bean实列。

       》HttpSession:对于不同的HttpSession,都将产生不同的Bean实列

  5、Bean后处理器:需要实现BeanPostPocessor接口。因为是有Spring自动调用,所以无需设置id属性。含有方法before和after方法,功能类似于Junit的before和after方法。是实现AOP的核心支持。

     》应用场景:配合代理模式实现对正在执行bean实列的增强。也是实现AOP的基本原理。

     》扩展:ClassLoader(引导类加载器),将.class文件加载到JVM中;AppClassLoader(应用类加载器),负责在JVM启动后,将系统命令所指定的jar包和类加载到JVM中;extClassLoader(扩展类加载器),负责加载java的扩展类库。

  

  6、定制Bean的生命始末:在进行Bean注册的时候,进行Bean的初始方法与销毁方法的 注册。

    》Bean的初始化根据不同的容器而存在不同的差异。

    》销毁方法的执行:单列模式(singlete),手动关闭容器(实际是使用容器接口的实现类进行关闭)

  7、Bean的生命周期:以Bean代码块各部分的执行时间点为基础进行分析(了解)。具体分析方式太复杂,记不得。大致可以容器对Bean初始化的控制,Bean后处理器的执行时间等

  8、<bean/>标签的id属性与name属性:实际上两种属性的功能相同。因为在后期的发展中,两者已基本没有差异。

    》id必须以字母开头
    》name:可以使用各种字符。

 

四、IOC的两种实现方式:

  ——基于Xml的Bean注入:使用子标签<properties>配置的属性。

  1、设置注入:由容器自动调用类的setter方法设置Bean属性。

    》字符串和基本类型:使用value属性

    》域对象加载:使用ref属性。

  2、构造注入(使用频率较低):使用带参构造器,底层实现是直接调用bean对象的带参构造。因此允许没有无参构造器。使用是子标签<constructor-arg index="" value=""/>。 实际应用中,index的起始位置可能需要测试才能知道。此种注入方式是根据构造方法的特性而存在差异性。它可以不需要依赖设置注入。

    》可以省略掉index,使用参数的默认顺序,但是当参数类型相同时,很容易出现错误。

    》使用name属性代替index,直接根据名字进行赋值。

  3、命名空间注入:使用P标签实现设置注入。

    》需要导入外部支持: xmlns:p = “http:// www .springframework.org / schema / p“ 。使用类似于JSTL的形式进行属性的配置。

  4、C命名空间构造注入:使用P标签实现构造注入。

    》需要导入外部支持

  5、集合属性注入(重点):也可以注入数组,但是数组实际不属于集合。(必须手动实践!)目前存在问题——无法注入基本类型的数组。

    》在<properties>标签下使用集合和数组所对应的子标签

    》更简洁的集合属性赋值方式; :对于数组,List、set集合,当内部元素不是域对象,即只是基本数据类型和字符串。可以直接{value1,value2,……}

    》域属性的自动注入:在<bean>标签中使用autowire属性。

        >byName:在查找容器中与id同名的Bean实体。

        >byType:在容器中查找与实体类类型相同的Bean。但是按类型匹配可能会发生匹配到多个类型相同的错误。

              **** 匹配出错的情况——已经提前注入了多个相同类型的Bean对象;因为Bean对象的向上转型和接口回调。

  6、使用SPEL注入:

         >语句格式:#{“” }   

         >功能:可以使用jdk提供的静态方法、简单的表达式。

  7、内部匿名Bean,取消id属性,并且配置在主体Bean的内部

         >匿名内部类类的注入。

  8、同类抽象Bean:abtract

         >同类抽象Bean:abtract

  9、异类抽象Bean:实际开放中使用比较少,因为后期Bean的生成是由数据库导入数据决定。

         > 父Bean没有class属性,只有子Bean拥有class属性,并使用parent属性完成继承

  ——基于注解的DI:替换的Bean的注册

    》需要导入context.xsd约束文档,需要注册文件文件扫描器

   》需要到aop.jar-release

  1、@componet:表示当前类被spring容器管理。

  2、@Repository:注解在Dao实现类上

  3、@service:注解在service实现类上

    4、@controller:注解在SpringMVC的处理器上

      》主要用于功能的扩展,目前的功能与component组件的功能相同。

      》@scope:为对象指定域,默认为singlete单列模式

  5、域对象的注解:只能找到一个

      》 @Autowired:byType,按类型查找

      》@Qualifier(“id值”),需要与Autowired联合使用。属于byName,即按id名查找。

  6、@PostConstruct:bean初始化前的方法注解

  7、@PreDestroy:Bean初始化后方法注解

  8、@Configuration:将当前类当作spring容器,所有需要的Bean将前类进行创造。

      》@Bean:在类内部进行Bean属性的配置。

 

  ——基于xml的注入优先级高于基于注解的注入。

  1、区别:注解注入不依赖于类的setter方法,而基于xml的注入必须依赖类的setter方法。

  2、xml的优先级高于注解的好处:有利于项目的发布于修改。即可以把注解当作是设置默认值。

  ——指定应用对应多个spring配置文件:拆分spring,避免臃肿。

  1、平等关系:

  2、上下级关系:上级使用<import resource=""/>,导入下级。

 

posted @ 2019-05-14 13:20  怪兽不纯粹  阅读(41)  评论(0)    收藏  举报