如何理解SpringIoc容器Bean

本篇内容主要讲解“如何理解Spring Ioc容器Bean”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Spring Ioc容器Bean”吧!

成都创新互联专注于通渭企业网站建设,成都响应式网站建设公司,成都做商城网站。通渭网站建设公司,为通渭等地区提供建站服务。全流程按需求定制制作,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务

Bean的命名

Bean在Ioc容器中可以有一个或多个名称,但这些名称在容器内必须唯一,在Xml中配置id和name属性就可以为Bean起别名。

这样我们就可以通过名称user、zhangsan、lisi获取UserBean的实例。

当然如果你没有给UserBean配置id/name属性,Spring Ioc容器会未Bean自动生成一个类名首字符小写的别名。

除此之外还可以使用配置别名。

Bean的实例化

class属性代表着Ioc要实例化的Bean的类型,通常Ioc容器会通过反射机制调用其无参构造函数直接创建Bean。

除此之外还可以配置使用静态工厂方法或者实例工厂方法来实例化对象。

/**
 * 使用静态工厂实例化Bean
 * 配置factory-method属性
 */
public class StaticFactory {

    private static UserBean userBean = new UserBean();

    public static UserBean createInstance() {
        return userBean;
    }
}

使用class来指定包含static工厂方法的类型,使用factory-method指定创建bean实例的工厂方法。

/**
 * 实例工厂方法
 * 配置factory-bean和factory-method属性
 */
public class InstanceFactory {

    public UserBean createUserBeanInstance() {
        return new UserBean();
    }
}

<beanid="instanceFactory"class="com.example.demo.spring.InstanceFactory">bean> <beanid="user2"factory-bean="instanceFactory"factory-method="createUserBeanInstance">bean>

使用factory-bean指定要创建Bean实例的方法的Bean的名称,使用factory-method指定工厂方法名称。

Bean依赖注入

依赖注入指Ioc要创建A的实例,但A内部又依赖于B的实例,依赖注入主要有两种类型:基于构造函数的依赖注入和基于Setter的依赖注入。

  • 构造函数注入

        基于构造函数的依赖注入主要依赖于标签。

  • 使用type属性显式指定了构造函数参数的类型

    

指定type的配置为Integer并且只有一个参数,所以Ioc在创建UserBean实例是会使用如下的构造函数

 

public UserBean(Integer age) {    this.age = age;    System.out.println("1");}
  • 使用index属性来显式指定构造函数参数的索引

                        

指定了有两个参数,所以会使用如下构造函数

public UserBean(Integer age, String name) {    this.age = age;    this.name = name;    System.out.println("2");}
  • 使用构造函数参数名称

    

 Setter注入

        使用Setter注入,必须保证要注入的属性具有setter方法,setter方法可以利用idea自动生成。主要依赖于

        
  • list属性的配置

                        123456789            99999                        
  • Map属性的配置

                                         

Bean的作用域

bean的作用域通过scope属性配置

scope描述
singletonSpring Ioc容器中只有一个实例
prototype每次获取bena实例都重新创建一个新的
requestHTTP 请求的生命周期
sessionHTTP Session的生命周期
applicationServletContext的生命周期
websocketWebSocket的生命周期

Bean的生命周期回调

  • InitializingBean: Bean在初始化时调用,等价于init-method属性和@PostConstruct注解,如果不指定初始化方法,Spring 默认会调用init()方法

  • DisposableBean:Bean在销毁时调用,等价于destroy-method属性和@PreDestroy注解,Spring 默认调用destroy()方法

  • Lifecycle:容器启动或关闭时回调,该回调是通过 LifecycleProcessor 完成回调

  • ApplicationContextAware:自动获取ApplicationContext的引用

  • BeanNameAware:获取该对象在Ioc容器中的名称,该方法在调用 afterPropertiesSet 或自定义的 init-method 之前调用

除此之外还有其他的Aware,功能是为了获得接口申明的依赖

namedependency
ApplicationEventPublisherAwareApplicationContext的事件发布者
BeanFactoryAwareBean工厂
ServletConfigAware容器中的ServletConfig(Web容器)
ServletContextAware容器中运行的ServletContext(Web容器)
BeanClassLoaderAwareBean的类加载器

 Bean的parent属性

parent属性用来指定要继承的配置数据,parent所指向的bean的定义必须要指定abstract属性为true,声明为抽象定义的Bean不能通过id获取实例,parent中定义的属性如果子bean重新配置,则会覆盖父bean的配置。

                        

Bean的扩展

  • BeanPostProcessor

BeanPostProcessor接口提供了两个方法postProcessBeforeInitialization(init之前调用)和 postProcessAfterInitialization (init之后调用),主要为了在Spring容器完成实例化、配置和初始化之后实现一些自定义的实例化或依赖解析逻辑等。一个容器中可以注册多个BeanPostProcessor,要控制他们的执行顺序,只需要继承Ordered接口。

public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("************postProcessBeforeInitialization*********** + " + beanName);        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("************postProcessAfterInitialization*********** + " + beanName);        return bean;    }}
  • BeanFactoryPostProcessor

     BeanFactoryPostProcessor是用来在beans进行初始化前修改bean的配置元数据。与BeanPostProcessor的主要区别是:BeanPostProcessor对Bean实例进行操作,BeanFactoryPostProcessor是对Bean的配置元数据进行操作。

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor, Ordered {    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {        System.out.println("postProcessBeanFactory >>>");        BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("message1");        System.out.println(beanDefinition.getBeanClassName());    }    @Override    public int getOrder() {        return 1;    }    public void init() {        System.out.println("MyBeanFactoryPostProcessor init");    }}
  • PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurer 可以从单独独文件中的 bean 定义外部化属性值,不同的环境中加载不同的配置文件。

            

也可以使用

  • PropertyOverrideConfigure

用来覆盖Bean的属性。

        

jdbc.properties

datasource.userName=rootdatasource.password=root

最终Bean password值会是root被PropertyOverrideConfigurer覆盖。

FactoryBean

FactoryBean是一个特殊的接口,它不同于BeanFactory,BeanFacoty是Spring的工厂,而FactoryBean是容器中的一个特殊bean,可以创建指定的类型Bean的实例。

public class DataSourceFanctoryBean implements FactoryBean {    @Override    public DataSource getObject() throws Exception {        System.out.println(1);        DataSource dataSource = new DataSource();        dataSource.setUserName("张三");        dataSource.setPassword("123456");        return dataSource;    }    @Override    public Class getObjectType() {        return DataSource.class;    }    @Override    public boolean isSingleton() {        return false;    }}
直接通过beanfactory.getBean("datasource")获取则是 DataSource 的实例,在id前加 & 则获取的是 DataSourceFanctoryBean 的实例

到此,相信大家对“如何理解Spring Ioc容器Bean”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


网站题目:如何理解SpringIoc容器Bean
标题路径:http://myzitong.com/article/pidhgc.html