一:IOC
1:IOC:控制反转,把原本代码里需要实现的对象创建关系,依赖反转给容器来帮助实现,这需要我们创建一个容器并且把对象之间的依赖关系告诉容器;IOC容器就像一个工厂一样,当我们需要创建对象时,只需要配置好配置文件/注解即可,完全不用管对象是如何创建的;说白了,以前由对象控制其他对象,现在所有对象都由spring控制,这就叫控制反转;
2:依赖注入:对象被动的接收依赖类不用自己主动去找,对象不是从容器中查找它依赖的类,而是在容器实例化对象时主动将它的依赖类注入给它;
即:IOC让对象的创建不用去new,可以由spring自动产生,使用java的反射机制,根据配置文件在运行时去创建对象以及管理对象,并调用对象的方法;
3:依赖注入的三种方式:
<1>接口注入:实现接口,接口提供方法为其注入对象;由于强制实现不必要的接口,带有侵入性,不提倡使用;
<2>构造方法注入:检查被注入的对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象;
优点:在获取bean对象时,注入数据是必要的操作,对象构造完成后处于就绪状态,可以马上使用;
缺点:依赖对象较多时,构造方法参数列表过长,构造方法无法被继承,无法设置默认值;
<3>setter注入:对象只需要为其依赖对象属性添加setter方法,可通过setter方法将对象关系注入到被依赖对象中;
优点:可继承,可设置默认值;
缺点:无法在对象构造完成后就进入就绪状态;
4:spring bean的生命周期:
spring bean:bean就是由IOC容器初始化,配置及管理的对象;
<1>实例化一个bean;
<2>按照spring上下文对实例化的bean进行配置,也就是IOC注入;
<3>如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,传递的参数就是Spring配置文件中Bean的id值;
<4>如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(BeanFactory),传递的是Spring工厂自身;
<5>如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;
<6>如果这个Bean关联了BeanPostProcessor接口,将会调用前置处理方法,在bean初始化前完成;
<7>如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法;
<8>如果这个Bean关联了BeanPostProcessor接口,将会调用后置处理方法,这个方法在bean初始化完成后进行;
<9>如果Bean实现了DisposableBean这个接口,在销毁时,会调用destroy()方法;
<10>如果bean使用了destory-method 声明销毁方法,会调用其设置的销毁方法;
5:spring bean的创建方式:
<1>默认构造函数:指明bean标签中的id和class属性;
<2>静态工厂:bean标签中的class属性指明静态工厂;
<3>实例工厂:通过bean标签中的factory-bean属性指明工厂;
6:spring bean的作用域:
二:spring AOP
1:spring AOP:面向切面编程,用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑封装为一个可重用的模块,减少系统中的重复代码,降低模块间的耦合度,同时提高系统的可维护性;实现的关键在于代理模式;
2:AOP代理分为静态代理和动态代理;
静态代理:由程序员创建或由特定工具生成的源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了(编译时增强);即在编译阶段将切面织入到java的.class文件中,运行时是增强后的AOP对象;
缺点:如果需要代理的方法较多,代码运行时容易产生很多冗余;
动态代理:在运行时运用反射机制动态的创建;即运行时在内存值临时为方法生成一个AOP对象,包括目标对象的全部方法,并且在特定的切点处做增强处理,并回调源对象的方法;
3:动态代理:JDK代理,CGlib代理
<1>JDK代理:
JDK只提供接口的代理,不支持类的代理;核心使用到Proxy类和InvocationHandler接口;
InvocationHandler接口通过invoke()方法反射来调用目标类中的代码,动态的将横切逻辑与业务编制在一起;
Proxy利用InvocationHandler动态创建一个符合某一个接口的实例,生成目标类的代理对象;
优点:因为有接口,系统更加耦合;
缺点:需要为每一个目标类创建接口;
<2>CGlib代理:若目标没有接口,则使用CGlib进行动态代理;它是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码;
优点:因为代理类和目标类是继承关系,所以不需要接口;
缺点:因为没有接口,系统耦合性不如JDK代理;
4:5种类型通知
Before:前置通知,方法执行前通知;
After-Returning:后置通知,方法成功执行后通知;
After-Throwing:异常通知,在方法抛出异常后调用通知;
Around:环绕通知,在目标方法之前之后都调用;
After:最终通知,方法完成后通知,无论方法是否执行成功;