Spring IOC

IOC:Inversion of Control 控制反转. 指的是 对象的创建权反转(交给)给Spring.

作用是实现了程序的解耦合.

1.IOC和DI:

IOC :控制反转,将对象的创建权交给了Spring.

DI   :Dependency Injection 依赖注入.需要有IOC的环境,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去.

  例如:如果UserServiceImpl的实现类中有一个属性,那么使用Spring框架的IOC功能时,可以通过依赖注入把该属性的值传入进来!!

  具体的配置如下

    <bean id="us" class="com.itheima.demo1.UserServiceImpl">
      <property name="uname" value="小风"/>
    </bean>

2.Spring框架的属性注入

  1. 对于类成员变量,常用的注入方式有两种
    构造函数注入
    属性setter方法注入

3. BeanFactory和ApplicationContext的区别:

  BeanFactory     :是在getBean的时候才会生成类的实例.

  ApplicationContext  :在加载applicationContext.xml时候就会创建.

4.Spring中<bean>标签的配置

  1. id属性和name属性的区别
     id -- Bean起个名字,在约束中采用ID的约束,唯一
      取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符

    name -- Bean起个名字,没有采用ID的约束(了解)
       取值要求:name:出现特殊字符.如果<bean>没有id的话 , name可以当做id使用
  2. class属性 -- Bean对象的全路径
  3. scope属性 -- scope属性代表Bean的作用范围
     singleton -- 单例(默认值)
    prototype -- 多例,在Spring框架整合Struts2框架的时候,Action类也需要交给Spring做管理,配置把Action类配置成多例!!
    request -- 应用在Web项目中,每次HTTP请求都会创建一个新的Bean
    session -- 应用在Web项目中,同一个HTTP Session 共享一个Bean
    globalsession -- 应用在Web项目中,多服务器间的session
  4. Bean对象的创建和销毁的两个属性配置
    说明:Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法
     init-method -- 当bean被载入到容器的时候调用init-method属性指定的方法
     destroy-method -- 当bean从容器中删除的时候调用destroy-method属性指定的方法

5.Spring 的相关配置文件只加载一次 其中Bean对象默认单例原因?

  思考:启动web服务器时,创建ServletContext对象(这个对象服务器启动只创建一次,服务器宕机才被销毁),Spring的监听器ContextLoaderListener监听ServletContext对象的创建,执行方法加载applicationContext.xml配置文件,加载一次,对象已经被创建好了。(需要使用Web工厂的方式WebApplicationContext)

<!-- 配置WEB整合的监听器 -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 加载方式:默认只能加载WEB-INF目录下的配置文件,提供配置方式,加载src目录下 src目录编译后到WEB-INF/classes目录下-->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

6.Spring框架的IOC之注解方式

  1.在applicationContext.xml配置文件中开启组件扫描
    Spring的注解开发:组件扫描
    <context:component-scan base-package="com.fff"/>

  2.在l例如UserServiceImpl的实现类上添加注解
    @Component(value="userService") -- 相当于在XML的配置方式中 <bean id="userService" class="...">

  3.Spring框架中Bean管理的常用注解

    1. @Component:组件.(作用在类上)

    2. Spring中提供@Component的三个衍生注解:(功能是一致的)
      @Controller -- 作用在WEB层
      @Service -- 作用在业务层
      @Repository -- 作用在持久层

      说明:这三个注解是为了让标注类本身的用途清晰
    3. 属性注入的注解(说明:使用注解注入的方式,可以不用提供set方法)
      如果是注入的普通类型,可以使用value注解
        @Value -- 用于注入普通类型

      如果注入的是对象类型,使用如下注解
        @Autowired -- 默认按类型进行自动装配
      如果想按名称注入
        @Qualifier -- 强制使用名称注入

      @Resource -- 相当于@Autowired和@Qualifier一起使用
        强调:Java提供的注解
        属性使用name属性

7.Bean的生命周期:

  答:跟对象的生命周期实质上是一致的,大概分为三个阶段:

    1.实例化(为bean对象开辟空间)

    2.初始化(对对象的属性进行依赖注入,使用setter方法)

    3.销毁

  具体来讲的话分为这些:

    1. 实例化一个Bean,也就是我们通常说的new,默认为单例

    2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入

    3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID

    4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)

    5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法

    6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术

    7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法

    8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法

      注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例

    9. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法

    10. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

8.IoC的好处

  1. 对象创建统一管理
  2. 规范的对象生命周期管理
  3. 获取一致的对象(单例模式)

灵活的依赖注入

原文地址:https://www.cnblogs.com/fengcha0/p/10083582.html