Spring 与 IoC

控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对 象控制权的转移,从程序代码本身反转到了外部容器。
IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式有两种: 依赖注入和依赖查找。依赖注入方式应用更为广泛。
 依赖查找:Dependency Lookup,DL,容器提供回调接口和上下文环境,程序代码则需 要提供具体的查找方式。比较典型的是依赖于 JNDI 服务接口(Java Naming and Directory Interface)的查找。
 依赖注入:Dependency Injection,DI,程序代码不做定位查询,这些工作由容器自行完 成。依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建 被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。依赖注入是目前最优秀的 解耦方式。
Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持 POJO 之间依赖关 系的管理。依赖注入让 Spring 的 Bean 之间以配置文件的方式组织在一起,而不是以硬编码 的方式耦合在一起的。

静动态工厂模式实现了解耦合

image.png

Bean的感处理器(实现在同一代理对象对不同对象的操作比如:anyu,AYNU)

image.png

Bean的生命周期(可控时间点,成员在此可以获得)

实现BeanPostProcessor接口(Bean前后置处理器,前05-后08 节点)
如上图

  1. public class MyBeanPostProcessor implements BeanPostProcessor {
  2. // 前置处理器
  3. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  4. Class beanClass = bean.getClass();
  5. if (beanClass == ISomeService.class) {
  6. System.out.println("bean 对象初始化之前······");
  7. }
  8. return bean;
  9. }
  10. // 后置处理器 --- 此处具体的实现用的是Java中的动态代理
  11. public Object postProcessAfterInitialization(final Object beanInstance, String beanName) throws BeansException {
  12. // 为当前 bean 对象注册监控代理对象,负责增强 bean 对象方法的能力
  13. Class beanClass = beanInstance.getClass();
  14. if (beanClass == ISomeService.class) {
  15. Object proxy = Proxy.newProxyInstance(beanInstance.getClass().getClassLoader(),beanInstance.getClass().getInterfaces(), new InvocationHandler() {
  16. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  17. System.out.println("ISomeService 中的 doSome() 被拦截了···");
  18. String result = (String) method.invoke(beanInstance, args);
  19. return result.toUpperCase();
  20. }
  21. });
  22. return proxy;
  23. }
  24. return beanInstance;
  25. }
  26. }

image.png

afterPropertuesSet()方法,通知Bean初始化完毕
09(倒数第二)节点执行业务方法
image.png

容器中 Bean 的作用域

当通过 Spring 容器创建一个 Bean 实例时,不仅可以完成 Bean 的实例化,还可以通过 scope 属性,为 Bean 指定特定的作用域。Spring 支持 5 种作用域。
(1)singleton:单态模式。即在整个 Spring 容器中,使用 singleton 定义的 Bean 将是单例的, 只有一个实例。默认为单态的。
(2)prototype:原型模式。即每次使用 getBean 方法获取的同一个的实例都是一个 新的实例。
(3)request:对于每次 HTTP 请求,都将会产生一个不同的 Bean 实例。
(4)session:对于每个不同的 HTTP session,都将产生一个不同的 Bean 实例。
注意:
(1)对于 scope 的值 request、session 与 global session,只有在 Web 应用中使用 Spring 时, 该作用域才有效。
(2)对于 scope 为 singleton 的单例模式,该 Bean 是在容器被创建时即被装配好了。
(3)对于 scope 为 prototype 的原型模式,Bean 实例是在代码中使用该 Bean 实例时才进行 装配的。