Spring的那些事

一.什么是IOC?

    1.控制反转,把对象的创建和 对象之间的调用过程交给Spring进行管理。

    2.使用IOC的目的:为了降低耦合度

二.IOC的底层原理

     1.XML解析: DOM4J(API)进行解析

     2.工厂模式:工厂类先进行XML解析。通过反射创建对象(获取字节码对象class通过class.forname()方法,在通过字节码对象的newInstence()方法创建字节码对象)

     3.java反射:

三.IOC接口

    1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。 

    2.BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,不提供开发人员使用。(加载配置文件时不会创建对象,在获取或使用时才去创建对象)

    3.ApplicationContext:BeanFactory的子接口,功能更强大,供开发人员使用。(加载配置文件时就会把配置文件对象进行创建) 

四.Bean管理(创建对象,注入属性)

    1.注入属性:构造器注入,setter方法注入,根据注解注入。

    2.Bean作用域:默认单例,可设置为多实例,Bean标签里有个scope属性设置为prototype。(singleton,prototype,request,session)

    3.Bean生命周期:   

                              1).通过构造器创建Bean实例(无参数构造)

                              2).为Bean的属性设置值和对其他Bean的引用(调用set方法)

                              3).调用Bean的初始化方法(需要配置Bean标签的init_method方法)

                              4).Bean可以使用了,执行自身业务逻辑方法。

                              5).当Bean容器关闭,调用Bean的销毁方法(需要进行配置Bean标签的destroy_method方法)

                            注:在初始化之前会执行前置处理器postProcessBeforeInitialization方法,之后会执行后置处理器postProcessAfterInitialazation方法

五.Bean的自动装配

         1.Bean标签里有个autowire属性,可根据byName或者byType实现注入(@Autowired注解也可)

六、AOP(面向切面编程)

        1.AOP可对业务逻辑的各个部分进行隔离,从而使得业务逻辑之间的耦合度降低,提高程序的可重用性,提高开发效率。

        2.AOP可将一些通用的任务(安全管理,事务,日志,权限判断,异常处理等)进行集中处理,从而提供更好的复用性。

        3.实现: 不通过修改源代码的方式在主干功能上添加新功能。

        4.底层原理:(动态代理) 

                   1),有接口的情况:使用JDK的动态代理,通过创建接口实现类的代理对象来增强类的实现方法,java.lang.reflect.Proxy类里面提供了newProxyInstance方法创建代 理对象。

                    2),没有接口:使用Cglib的动态代理,通过创建当前类的子类的代理对象来增强父类的功能方法。

        5.AspectJ:Spring一般基于AspectJ实现AOP操作,是一个独立的AOP框架,不属于Spring,可基于XML配置或者注解来使用。

        6.AspectJ :

                    1):通过配置文件或者配置类来开启注解扫描。

                    2):使用注解来创建增强类和被增强类的对象。

                    3):在增强类上添加@Aspect注解

                    4):在Spring配置文件中开启ASpectJ生成代理对象。

                    5): 在增强类的增强方法上配置不同类型的通知 ,比如:@After/@Before/@Around/@AfterThrowing/@AfterReturning(value="execution(*被增强类的路径.类名.方法名(..))") 

                    6):@After(被增强类的方法执行未返回结果前执行)/@Before(比环绕通知早)/@Around(被增强类方法执行前后都执行)/@AfterThrowing(被增强类抛异常后执行)/@AfterReturning(被增强类的方法执行返回结果后执行)        @Pointcut用于相同切入点抽取 

                   7):有多个增强类对同一个类的方法进行增强时设置优先级,可通过在类上面添加@Order(数字类型值)注解来实现,数字类型值越小优先级越高

          

     

    

posted @ 2020-08-29 17:28  南柯旧梦  阅读(38)  评论(0)    收藏  举报