三分钟明白:为什么说spring是一个容器

1、引入

Spring容器是Spring的核心,一切Spring bean都存储在Spring容器内,并由其通过IoC技术管理。Spring容器也就是一个bean工厂(BeanFactory)。应用中bean的实例化,获取,销毁等都是由这个bean工厂管理的。

在使用Spring框架时,把Java对象交给Spring容器,不用自己手动new 对象。通过配置文件+注解的方式进行对象的创建和使用。

2、spring为什么是容器?容器又是什么?

最简单的一个例子,容器就像一个杯子,Spring初始化的时候会往杯子里放入乒乓球(对象),每一个乒乓球相当于一个对象,那么也就是说,我们把对象交给spring进行管理,不用我们手动new,我们需要的时候,就去容器里取出来不需要的话,它也在那里。

因此,容器,就是放对象,拿对象。Spring容器就是管理放进容器中的对象的。

spring容器启动完成后执行 spring 容器_spring容器启动完成后执行

3、我们看一个例子
第一步:创建UserDao类 ,打上注解
@Component
public class UserDao {
    public UserDao(){
        System.out.println("userdao被创建了");
    }
}
第二步:创建UserService类,打上注解
@Component
public class UserService {
    @Autowired//采用自动注入userDao对象
    private UserDao userDao; 

    public UserService(){
        System.out.println("UserService被创建了");
    }
    public UserDao getUserDao() {
        return userDao;
    }
}

第三步:配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!--    使用注解方式创建对象,开启组件扫描器-->
    <context:component-scan base-package="com.xiaobin"></context:component-scan>

</beans>
第四步:我们额外添加几个类,也打上注解
@Component
public class Student {
    private  String name;
    private int age;

    public Student() {
        System.out.println("student被创建了");
    }
}
@Component(value = "user")//user可省略,默认类名开头小写
public class User {
    public User(){
        System.out.println("user被创建了");
    }
}
第五步:编写测试方法
@Test
    public void TestUserservice(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserDao userDao1 = context.getBean("userDao", UserDao.class);//获取userDao的bean实例
        System.out.println("1 userdao:"+userDao1.toString());//输出userdao1的地址值
        UserService userService = context.getBean("userService", UserService.class);获取userService的bean实例
        UserDao userDao2 = userService.getUserDao();;//获取userService中的userDao属性
        System.out.println("2 userdao:"+userDao2.toString());//判断userDao1和userDao2是不是同一个
    }

测试结果

spring容器启动完成后执行 spring 容器_xml_02

可以看到,spring一共创建了四个实例,分别是student,user,userservice,userdao,其中,我们并没有主动去获取student和user的实例,但是spring帮我们进行了创建,因为它们头上都有注解。而这些spring帮我们创建的类,就由spring进行管理,spring就是一个容器,里面存放实例化的对象,不管我们有没有去拿这个实例化的对象,它都在那里。

并且我们可以发现,我们在userService中注入userDao属性,spring自动把它创建的userDao对象注入给了userService,通过输出tostring方法,发现二者的地址是一样的,spring帮我们完成了自动注入。

为什么二者的地址一致呢,因为spring默认使用单例模式实例化bean对象。