美文网首页Java 杂谈Spring-Boot
Spring IOC一分钟理解

Spring IOC一分钟理解

作者: Sunny旋律 | 来源:发表于2019-07-25 00:57 被阅读1次

    IOC,其实就是通过反射、xml解析等技术实现一个对象容器。通过xml配置的方式来告诉容器,应该将哪些bean到容器里,通过装配给对象属性赋值。然后在使用的时候,统一都到容器里去取。SpringBoot后就没用xml配置方式里,注解配置即可。

    1 IOC容器

    其实就是org.springframework.context.ApplicationContext这个类对象。如下

    //初始化容器,读取applicationContext.xml来初始化bean。
    //SpringBoot后其实是用的ConfigurableApplicationContext容器,没有用xml方式
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    
     //到容器里根据名字来获取对象
    UserServiceImpl userService = (UserServiceImpl)ctx.getBeans("userService")
    

    2 装配

    通过配置xml文件,给对象里的属性赋值。

    <bean id="userService" class="com.xx.xx.UserServiceImpl"> </bean>
    

    2.1 手动装配

    就是在xml文件中,配置bean的时候,将对象的属性的值一个一个自己填写赋值进去。数据类型包括(int, String, List, Map, Properties以及对象Object)。同时还可分为属性注入和构造器注入。属性注入,最终调用的是对象的set方法,所以每个需要装配的属性都需要提供set方法。构造器注入,最终调用的是有参构造器。

      <bean id="userService" class="com.xx.xx.UserServiceImpl">
        <!--属性注入-->
        <property name="age" value="12"></property> 
    
        <!--构造器注入,index代表有参构造器参数顺序-->
        <constructor-arg value="12" index="0"></constructor-arg>
    </bean>
    

    2.2 自动装配

    在xml文件中,配置bean的时候,例如注明 autowire=“byName”,最终在生成bean的时候,就会根据名字去自动配置。一共有三种装配方式:
    byName
    在容器中根据属性名称找对象
    通过属性的set方法装配
    找不到,不处理,默认值
    找到1个,调用set方法,属性注入
    找到多个---不存在该情况, 因为id是唯一的

    byType
    从容器中,找出同属性的类型相同的对象。
    通过set方法装配
    找不到,不处理,默认值。
    找到1个,调用set方法,属性注入
    找到多个,初始化容器的时候抛出找到符合多个条件的异常

    constructor
    从容器中,找同构造器参数相同的类型的对象。
    通过构造器装配。
    找不到,抛异常
    找到1个,调用构造器方法,构造器注入
    找到多个,抛异常

    byName示例:

    <bean id="userService" class="com.xx.xx.UserServiceImpl"> </bean>
    
    <!-- 假设UserMgrImpl类里有一个属性名称userService, byName的意思就是根据名字到容器里找bean-->
    <bean id="userMgr" class="com.xx.xx.UserMgrImpl" autowire="byName"> </bean>

    相关文章

      网友评论

        本文标题:Spring IOC一分钟理解

        本文链接:https://www.haomeiwen.com/subject/gssqrctx.html