[关闭]
@MrXiao 2017-06-13T13:05:56.000000Z 字数 5675 阅读 725

spring(2)--IOC浅析

未分类


1. 什么是IOC?

1.1 IoC(Inversion of Control)控制反转

1.2 spring演进模式

A.基于分层设计
    UserAction          使用UserService,new UserService()
    UserService         使用UserDAO,new UserDAO()
    UserDAO
B.工厂模式,使用面向接口编程设计,解决层与层之间的紧耦合
    制作接口,制作实现类,制作对象工厂
  1. A a = AFactory.createA();
  2. B b = BFactory.createB();
  3. a.setB(b);
C.工厂模式+配置
    制作XML文件,将实现类配置到XML文件中
    读取XML文件中的配置信息,得到实现类的类名
    使用反射思想,获取实现类对象 class.newInstance();
  1. A a = Factory.create(“a”);
  2. B b = Factory.create(“b”);
  3. a.setB(b);
  1. <!--配置xml-->
  2. a=AImpl
  3. b=BImpl
D.自动的工厂+配置
  1. //返回装配好的a
  2. A a = Factory.create(“a”);
  1. <!--xml配置-->
  2. <bean id=“a” class=“AImpl”>
  3. <property name=“b” ref=“b”/>
  4. </bean>
  5. <bean id=“b” class=“BImpl”/>
E.工厂由Spring提供,实现类使用XML格式配置
    工厂由Spring提供,实现类使用XML格式配置
  1. //返回装配好的a
  2. A a = ApplicationContext.getBean(“a”);
  1. <!--xml配置-->
  2. <bean id=“a” class=“AImpl”>
  3. <property name=“b” ref=“b”/>
  4. </bean>
  5. <bean id=“b” class=“BImpl”/>

2. 什么是DI?

2.1 DI的概念

DI(Dependency Injection)依赖注入,指应用程序依赖Spring为其提供运行时所需的资源.

更能描述容器其特点的名字——“依赖注入”(Dependency Injection)
IoC容器应该具有依赖注入功能,因此也可以叫DI容器

2.2 DI实现方式

  1. 构造器注入
  2. setter注入
  3. 接口注入

3. IOC和DI的关系?

IOC和DI其实是同一概念的两种说法,两者站立的角度不一样。
IOC:从spring的角度看,资源的控制权限被反转了
DI:从应用程序的角度看,应用程序要依赖spring为其注入资源。

4. BeanFactory

  1. BeanFactory是ApplicationContext的顶层父接口,使用BeanFactory接口也可以完成获取Bean的操作.
  2. 操作步骤:

    1. //初始化Resource对象
    2. Resource res = new ClassPathResource("applicationContext.xml");
    3. //初始化BeanFactory对象
    4. BeanFactory bf = new XmlBeanFactory(res);
    5. //根据id名称获取Bean
    6. UserService service = (UserService) bf.getBean("userService");
  3. AppplicationContext与BeanFactory的区别
    A. 加载方式不同

    AppplicationContext:立即加载,加载配置文件时即加载
    BeanFactory:延迟加载,获取Bean实例时才加载
    

    B. AppplicationContext具有更多的功能

    国际化处理
    事件传递
    Bean自动装配
    各种不同应用层的Context实现
    注意:实际开发中,优先选择ApplicationContext对象,避免使用BeanFactory
    
  4. Schema风格离线约束配置方式
    A.拷贝访问路径
    B.打开MyEclipse设置中的XML catalog选项
    C.创建新的映射
    D.选择对应的schema风格的约束文件
    E.将key type修改为schema location
    F.将要配置的路径复制到key中

5. Bean配置(XML)

5.1 Bean初始化

  1. 构造器初始化(重点)
    Bean对应的类必须提供一个默认无参可访问的构造方法
  2. 静态工厂初始化

    1. <bean id="userService2"
    2. <!--配置中所配置的class配置成工厂类的类名-->
    3. class="com.topvision.bean.UserStataicFactory"
    4. <!--配置工厂类中的创建实例的静态方法-->
    5. factory-method="getInst">
    6. </bean>
  3. 实例工厂初始化
    提供一个实例工厂类,使用其中的实例方法获取对象。由于该工厂类本身需要创建对象,因此该对象必须受Spring控制,所以必须配置该工厂类为Bean.

    1. <!—实例化工厂Bean -->
    2. <bean id="uf" class="com.topvision.bean.UserFactory"></bean>
    3. <!--使用实例工厂创建Bean -->
    4. <!--factory-bean: 配置实例工厂在Spring范围内对应的Bean的id名称-->
    5. <!--factory-method:配置工厂类中的创建实例的实例方法-->
    6. <bean id="userService3" factory-bean="uf" factory-method="getInst2"></bean>

5.2 Bean的作用域

Spring初始化的Bean默认为单例模式,如果想修改成非单例模式需要修改Bean的作用范围。

  1. <bean id=”beanId” class=”BeanClassName” scope=”prototype”></bean>
    scope属性:
        singleton:单例
        prototype:非单例
        request:请求对象范围request.setAttribute("beanId",obj);
        session:会话Session范围request.getSession().setAttribute("beanId",obj);
        globalSession:全局会话,分布式服务器

5.3 Bean的生命周期

定义Bean初始化与销毁时的动作,属于回调方法配置
定义bean时指定两个回调方法,控制bean的初始化与销毁操作时执行的动作

  1. <bean id="user" class="com.topvision.lifecycle.User" init-method="init" destroy-method="destroy" scope="prototype"></bean>

5.4 Bean属性注入

  1. 构造器注入(了解)
    A.在domain中提供对象的构造方法
    B.xml配置中设置构造方法的参数

    1. <!-- constructor-arg:使用构造器传递参数 -->
    2. <!-- value:赋值 -->
    3. <bean id="bean6" class="com.topvision.bean.xml.Bean6">
    4. <constructor-arg value="topvision"/>
    5. <constructor-arg value="2017"/>
    6. </bean>

    注意:如果类型匹配不成功,可以为配置中指定index索引属性,对应构造器中参数的位置.

    1. <bean id="bean6" class="com.topvision.bean.xml.Bean6">
    2. <constructor-arg index="0" value="2014" type="java.lang.Integer"></constructor-arg>
    3. <constructor-arg index="1" value="topvision" type="java.lang.String"></constructor-arg>
    4. </bean>

    说明:构造器传参受构造器参数位置和类型的限定,因此不常使用

  2. setter注入
    前提:setter注入要求Bean必须提供无参可访问构造方法

    A.注入简单类型

    1.提供对应要注入的属性
    2.为每个要注入的属性提供对应的标准封装setter方法
    3.在配置中为Bean指定要注入的属性,使用property元素 name=“属性名” value=”值”
    
    1. <property name="属性名" value="值"/>

    B.注入引用类型

    1.为某个Bean注入引用类型的值,首先在Bean对应的类中声明对应的属性
    
    1. private TeacherDAO dao;
    2.为每个要注入的属性提供对应的标准封装setter方法 (访问器)
    
    1. public void setDao(TeacherDAO dao) {
    2. this.dao = dao;
    3. }
    3.必须保障引入的对象是Spring控制的Bean
    
    1. <!-- 声明引用类型的资源为Bean -->
    2. <bean id="teacherDao" class="com.topvision.di.setter.TeacherDAO"> </bean>
    4.在Bean的属性注入中,使用ref引用对应的资源 ref=”beanId/beanName”
    
    1. <!-- setter注入 -->
    2. <!-- name:属性名 -->
    3. <!-- value:简单类型的值 -->
    4. <!-- ref:引用别的Bean,beanId/beanName -->
    5. <bean id="bean7" class="com.topvision.bean.xml.Bean7">
    6. <property name="name" value="topvision"/>
    7. <property name="age" value="8"/>
    8. <property name="dao" ref="teacherDao"></property>
    9. </bean>

6. Bean配置(注解)

从Spring2.5开始提供使用注解的形式配置Bean。

6.1 配置Bean使用@Component注解

如需为Bean定义名称,在参数中添加Bean名称@Component("beanName")

6.2 设定Spring的自动扫描路径

用于检测对应的Bean是否配置了注解,并加载配置了注解的类

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  1. <context:component-scan base-package="com.topvision.annotation"></context:component-scan>

说明:扫描路径可以设置多个,中间使用,隔开,扫描路径包含指定包和子包内所有的类,通常使用*号通配符匹配路径

6.3 Spring提供的三个注解

  1. @Repository 用于数据层实现类标注
  2. @Service 用于业务逻辑层实现类标注
  3. @Controller 用于控制层实现类进行标注

6.4 注入简单类型

  1. 在属性名上方声明该属性自动装配@Autowired
  2. 在属性名上方声明该属性注入的值@Value(value)
  1. @Autowired
  2. @Value("topvision")
  3. private String msg;

注意:注解自动装配属性值无需提供对应属性的setter方法

6.5 注入引用类型

  1. 在属性名上方声明该属性自动装配@Autowired
  2. 在属性名上方声明该属性注入的值@Qualifier(bean引用名称)
  1. @Autowired
  2. @Qualifier("anno2")
  3. private AnnotationOther other;

6.6

博客链接

  1. 源码解读Spring IOC原理
  2. Spring源代码解析
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注