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=""/>,导入下级。

浙公网安备 33010602011771号