揭开Spring的神秘面纱(下)

4、解密Spring框架——回头再来理解IOC/DI和Bean的创建

IOC/DI:代码本质上基于Java反射原理实现。

最简单的理解:之前传统的做法是,在调用者中创建(New)被调用者,导致类与类之间高度耦合。现在Spring的做法是通过外部注入依赖,实例不在由我们调用者主动进行实例化,而是通过IOC容器帮我们创建指定实例并且将实例注入到所需要的调用者,也就是被动注入,由容器进行注入组合对象,所以对象与对象之间是松耦合,也利于功能的复用。这就是所谓的IOC/DI。

 

理解的关键是:谁依赖谁,为什么需要依赖,谁注入谁,注入了什么。

  • 谁依赖于谁:当然是应用程序依赖于IOC容器。
  • 为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源。
  • 谁注入谁:很明显是IOC容器注入应用程序某个对象,应用程序依赖对象。
  • 注入了什么:就是注入某个对象所需要的外部资源(包括对象,资源,常量数据)

 

5、这是最后的问题了,Bean何时被创建了呢?

重点:日志开放到Debug级别,让我们来启动程序找找看!!!

也就是容器初期化时立即创建对象。当然,也可以延迟加载,在用到的时候再创建,有个属性beans default-lazy-init=“true”可以设置。

PS:Spring创建对象有三种方式,这里就不讲了,感兴趣的可以上网查查。

 

作用域:

  • Singleton(默认)——只会存在一个共享的Bean实例,也就是说IOC容器只会创建该Bean定义的唯一实例。
  • Prototype——每次请求(调用bean方法)会产生新的bean实例,相当于new操作。

 

 

5、解密Spring框架——AOP是什么,你不知道而又常见的具体实现是什么

AOP:面向切面编程,本质上是基于动态代理实现的(代理模式)。再挖的深一点,还是Java的反射。

AOP基本概念很好理解,就是在正常业务处理流程代码之外,切入一些其他的共同业务逻辑代码,但这些代码并不冗余在正常业务逻辑处理之中,提高代码的复用性的同时降低耦合度。

揭开Spring的神秘面纱(下)_第1张图片

 

AOP自身的核心概念和早期流行用Aspect实现就不详细讲了,主要就是用before和after-returning创建前置通知、后置通知和环绕通知等。大家可以具体上网查查,资料非常多。

除了Aspect,Filter和Interceptor其实也是AOP的具体实现的方式,是不是既熟悉又陌生。

 

问题:Filter、Interceptor和AOP的区别是什么?执行先后顺序又是什么样子的?

区别:

  •   Filter主要处理最初的http请求,看程序是否要接受该请求。
  •   Interceptor主要控制请求控制器和里面的方法,也就是Controller
  •   层,但是无法继续深入控制,比如控制请求方法的参数。
  •   Aspect可以自定义切入点,所以最灵活,可以更深入控制,主要用于  业务层Service控制。

执行顺序:

  • 一个请求过来之后,先Filter过滤。
  • 然后程序中拦截器进行处理。
  • 最后处理完后,被AOP动态代理重新编译过的主要业务类进行处理。

揭开Spring的神秘面纱(下)_第2张图片

 

6、解密Spring框架——Spring常用注解解密

  • @Configuration(定义配置类,可替换xml配置文件)
  • @ComponentScan(专用于扫描@Component的类加入到IOC容器中)
  • @Component(一个元注解,意思是可以注解其他类注解,如@Controller、@Service、@Repository。此注解的类被看作组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化)
  • @Bean(替代 XML 元素)
  • @Autowired(Bean的依赖注入,默认是byType)
  • @Value(为变量和方法参数指定默认值,也用来读取Spring环境变量和系统变量)

 

你可能感兴趣的:(Spring,Java)