三分钟明白:为什么说spring是一个容器
1、引入
Spring容器是Spring的核心,一切Spring bean都存储在Spring容器内,并由其通过IoC技术管理。Spring容器也就是一个bean工厂(BeanFactory)。应用中bean的实例化,获取,销毁等都是由这个bean工厂管理的。
在使用Spring框架时,把Java对象交给Spring容器,不用自己手动new 对象。通过配置文件+注解的方式进行对象的创建和使用。
2、spring为什么是容器?容器又是什么?
最简单的一个例子,容器就像一个杯子,Spring初始化的时候会往杯子里放入乒乓球(对象),每一个乒乓球相当于一个对象,那么也就是说,我们把对象交给spring进行管理,不用我们手动new,我们需要的时候,就去容器里取出来,不需要的话,它也在那里。
因此,容器,就是放对象,拿对象。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一共创建了四个实例,分别是student,user,userservice,userdao,其中,我们并没有主动去获取student和user的实例,但是spring帮我们进行了创建,因为它们头上都有注解。而这些spring帮我们创建的类,就由spring进行管理,spring就是一个容器,里面存放实例化的对象,不管我们有没有去拿这个实例化的对象,它都在那里。
并且我们可以发现,我们在userService中注入userDao属性,spring自动把它创建的userDao对象注入给了userService,通过输出tostring方法,发现二者的地址是一样的,spring帮我们完成了自动注入。
为什么二者的地址一致呢,因为spring默认使用单例模式实例化bean对象。