SpringIoc Bean的创建方式

r囧r小猫 2022-01-06 01:51 389阅读 0赞

什么是IOC,作用是什么

IOC的定义( Inversion of Controle, 控制反转),是Spring的核心功能,将我们程序中使用的对象交给Spring 来管理,包括对象创建和销毁,最后在通过依赖注入的方式来实现我们程序的调用等,这可以带来很多好处:

  1. 资源集中管理,实现资源的可配置和易管理。
  2. 降低了使用资源双方的依赖程度,也就是我们说的耦合度。

测试SpringIoc项目创建

  1. Maven 配置:


    org.springframework
    spring-context
    5.0.7.RELEASE


    org.springframework
    spring-test
    5.0.7.RELEASE


    junit
    junit
    4.12
  2. 创建我们自己的Service

    public class UserService {

    1. private String name;
    2. public UserService(){
    3. System.out.println("我是无参构造函数");
    4. }
    5. public UserService(String name) {
    6. this.name = name;
    7. System.out.println("我是带参构造函数 " );
    8. }
    9. public void sayHello(){
    10. System.out.println("Hello, My name is " + name);
    11. }

    }

  3. 创建Spring配置文件: Spring-csdn.xml

    <?xml version=”1.0” encoding=”UTF-8”?>





  4. 创建TestUserService:

    public class TestUserService {

    1. @Test
    2. public void testIoc(){
    3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-csdn.xml");
    4. UserService userService = (UserService) applicationContext.getBean("com.lot.test.UserService");
    5. userService.sayHello();
    6. }

    }

Bean 的创建方式:

  1. 无参构造方式, 在spring-csdn.xml中加入配置:

    1. <!-- 无参构造方式创建 -->
    2. <bean class="com.lot.test.UserService"/>

    执行 TestUserService.testIoc(),打印为:

    1. 我是无参构造函数
    2. Hello, My name is null
  2. 带参数的构造方式, 在spring-csdn.xml中加入配置:

    1. <!--带参构造方式创建-->
    2. <bean class="com.lot.test.UserService">
    3. <constructor-arg name="name" value="张井天" />
    4. </bean>

    执行 TestUserService.testIoc(),打印为:

    1. 我是带参构造函数
    2. Hello, My name is 张井天
  3. 在具体工作中,为了简化配置可以加入标签: component-scan ,在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean

    1. <context:component-scan base-package="com.lot.test" />

    执行 TestUserService.testIoc(),将com.lot.test.UserService 修改为 userService,打印为:

    1. 我是无参构造函数
    2. Hello, My name is null

SpringIoc 创建Bean流程图

  1. Spring的源码比较复杂,下面仅仅是博主的一些认识:
  2. Spring 首先加载我们配置的 spring-csdn.xml文件,然后对应每个Bean生成 beanDefinition 保存到 CurrentHashMap中,简略时序图如下:
    在这里插入图片描述
  3. 当初始化 beanDefinitionMap后,会继续将beanDefinition 实例化为Bean 保存到 DefaultSingletonBeanRegistry 中属性 singletonObjects中,简略时序图如下:

在这里插入图片描述

  1. 当我调用getBean时,如果是单例的Bean 会直接从singletonObjects 中获取(懒加载会先创建),非单例时,会根据 beanDefinition中保存的信息重新创建bean,返回给程序。
以上仅为博主的粗浅认识,大家有更好的建议请留言,博主会及时更正!!!

发表评论

表情:
评论列表 (有 0 条评论,389人围观)

还没有评论,来说两句吧...

相关阅读