Spring Bean详解

转载:https://blog.csdn.net/suannai11/article/details/87898317

一、Spring Bean是什么?

我个人的理解,觉得bean就相当于定义一个组件,这个组件是用于具体实现某个功能的。这里的所定义的bean就相当于给了你一个简洁方便的方法来调用这个组件实现你要完成的功能。

  • Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
  • 凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;
  • 规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;(@Component , @Repository ,
    @ Controller , @Service , @Configration)
  • 把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了
  • 我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean(注册)或者给出一个Bean(使用)

二.怎么使用bean?

对于我们的spring最主要的应该就是由这些bean组成的bean工厂,每个bean实现一个功能。
例如:你写的第一个bean

<bean id="userAction" class="com.neusoft.gmsbs.gms.user.action.UserAction"
scope="prototype">
<property name="userBO" ref="userBO" />
</bean>

id相当于定义了你的这个bean的别名,如果你需要他的话只要关联这个别名就可以了,也就相当于下面的一样,在你的userAction中需要实现userBO这个功能,我关联它,那么在action中set注入就可以使用了! 相当于给对象中的属性设置一个值!ref引用容器中创建好的对象
在这里插入图片描述

至于其他的属性看下面:
Id : 标识该bean的名称,通过factory.getBean(“id”)来获得实例。
Class : 该bean的类路径。
Singleton : 默认为true,即单实例模式,每次getBean(“id”)时获取的都是同
一个实例,如果设置为false,即原型模式,则每次获取的是新创建
的实例。

public class Spring {
    
    
    @Test
    public void demo(){
    
    
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
       Person persion1 =  (Person)applicationContext.getBean("person");
       Person persion2 =  (Person)applicationContext.getBean("person");
        System.out.println(persion1);
        System.out.println(persion2);
    }
}

1、凡是子类及带属性、方法的类都注册Bean到Spring中,交给它管理;
2、@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean

三、Bean配置

ID,name 或class
一般情况下,转配一个Bean时,通过指定一个ID属性作为Bean的名称
1.id属性在IOC容器中必须是唯一的
2.如果Bean的名称中含有特殊字符,就需要使用name属性
3.class用于设置一个类的完全路径名称,主要作用是ioc容器生成类的实例

四.Bean的作用域

在这里插入图片描述

五、Bean的生命周期

在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了。一旦bean不再被使用,则由Java自动进行垃圾回收。

相比之下,Spring管理Bean的生命周期就复杂多了,正确理解Bean 的生命周期非常重要,因为Spring对Bean的管理可扩展性非常强,下面展示了一个Bean的构造过程

在这里插入图片描述
Bean 的生命周期深入了解
如上图所示,Bean 的生命周期还是比较复杂的,下面来对上图每一个步骤做文字描述:

  • Spring启动Spring启动过程链接,查找并加载需要被Spring管理的bean,进行Bean的实例化
  • Bean实例化后对将Bean的引入和值注入到Bean的属性中
  • 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
  • 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
  • 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
  • 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
  • 如果Bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
  • 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
  • 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
  • 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method声明销毁方法,该方法也会被调用。

猜你喜欢

转载自blog.csdn.net/weixin_42754971/article/details/114197231