在之前的学习中我们知道,容器是一个空间的概念,一般理解为可盛放物体的地方。在Spring容器通常理解为BeanFactory或者ApplicationContext。我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象。
那么Spring是如何管理Bean的呢?
简而言之,Spring bean是Spring框架在运行时管理的对象。Spring bean是任何Spring应用程序的基本构建块。你编写的大多数应用程序逻辑代码都将放在Spring bean中。
Spring bean的管理包括:
Spring bean是框架的基本概念。作为Spring的用户,你应该对这个核心抽象有深刻的理解。
public class UserServiceImpl { }
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); // 2、从容器中根据id获取对象(bean) UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService"); // 3、打印bean System.out.println(userService); }
此种方式采用的就是通过默认构造函数的方式创建Bean,假设我们给UserServiceImpl添加了一个带参的构造方法,则运行会报错,原因在于当我们为某个类自定义构造方法的时候,Java编译器便不会为该类提供默认的不带参数的构造方法了。
// UserService的工厂,作用是创建UserServiceBean对象 public class UserServiceImplFactory { public UserServiceImpl createUserService(){ return new UserServiceImpl(); } }
public class UserServiceImpl { }
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); // 2、从容器中根据id获取对象(bean) UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService"); // 3、打印bean System.out.println(userService); }
// UserService的工厂,作用是创建UserServiceBean对象 public class UserServiceImplFactory { public static UserServiceImpl createUserService(){ return new UserServiceImpl(); } }
public class UserServiceImpl { }
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); // 2、从容器中根据id获取对象(bean) UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService"); // 3、打印bean System.out.println(userService); }
Spring对Bean的默认的作用域(作用范围)是singleton【单例】
singleton:单例的(默认值),只会new一次。
prototype:多例的,用到一次就会new一次。
request:作用于web应用的请求范围,Spring创建这个类之后,将这个类存到request范围内。
session:应用于web项目的会话范围,Spring创建这个类之后,将这个类存到session范围内。
global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session。
实际开发中用得最多的就是singleton和prototype,在整合struts2的时候使用prototype,在整合SpringMVC的时候使用singleton。
bean标签的scope属性,作用:指定bean的作用范围。
public class UserServiceImpl { }
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); // 2、从容器中根据id获取对象(bean) UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService"); UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService"); // 3、打印bean System.out.println(userService1 == userService2); // true }
public class UserServiceImpl { }
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); // 2、从容器中根据id获取对象(bean) UserServiceImpl userService1 = (UserServiceImpl) ac.getBean("userService"); UserServiceImpl userService2 = (UserServiceImpl) ac.getBean("userService"); // 3、打印bean System.out.println(userService1 == userService2); // false }
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡
public class UserServiceImpl { public UserServiceImpl(){ System.out.println("对象的构造方法执行了"); } public void init(){ System.out.println("对象初始化了"); } public void destroy(){ System.out.println("对象销毁了"); } }
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); ac.close(); } // 结果:对于单例对象来说,只要容器创建了,那么对象就创建了。类似于立即加载。
对象的构造方法执行了
对象初始化了
对象销毁了
总结:单例对象的生命周期和容器相同
出生:当我们使用对象时spring框架为我们创建
活着:对象只要是在使用过程中就一直活着。
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收
public class UserServiceImpl { public UserServiceImpl(){ System.out.println("对象的构造方法执行了"); } public void init(){ System.out.println("对象初始化了"); } public void destroy(){ System.out.println("对象销毁了"); } }
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); ac.close(); } // 结果:什么都不输出,说明容器启动的时候,对于多例对象来说并不会创建
@Test public void testUserService() throws Exception{ // 1、读取主配置文件信息,获取核心容器对象 ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); UserServiceImpl userService = (UserServiceImpl) ac.getBean("userService"); System.out.println(userService); ac.close(); } /** 结果: 对象的构造方法执行了 对象初始化了 说明: 对于多例对象来说,只有等到真正使用到该对象的时候才会创建。类似于懒加载。 **/
对于多例的Bean,Spring框架是不负责管理的
以上就是本篇文章的全部内容了,如果对你有帮助的话,可以点个免费的关注,如果能在下方三连一下就更好啦,你的支持就是我更新的动力!