牡丹江建设局网站,公司建站比较好的,无锡做网站哪家公司好,中国建设银行网上银行网站目录
1.Bean的定义
2.Bean的生命周期
3.BeanFactory及Factory Bean
4.Bean的作用域
5.Bean的线程安全问题 1.Bean的定义
JavaBean是描述Java的软件组件模型。在Java模型中#xff0c;通过JavaBean可以无限扩充Java程序的功能#xff0c;通过JavaBean的组合可以快速的生…目录
1.Bean的定义
2.Bean的生命周期
3.BeanFactory及Factory Bean
4.Bean的作用域
5.Bean的线程安全问题 1.Bean的定义
JavaBean是描述Java的软件组件模型。在Java模型中通过JavaBean可以无限扩充Java程序的功能通过JavaBean的组合可以快速的生成新的应用程序。对于程序员来说最好的一点就是JavaBean可以实现代码的重复利用另外对于程序的易维护性等等也有很重大的意义。
Spring bean是Spring框架在运行时管理的对象是任何Spring应用程序的基本构建块它与使用关键字new创建的java对象没有区别。
目前主要通过三种不同的方式定义Spring bean
使用Component等相关注解比如Service、Controller等注释你的类编写在自定义Java配置类中使用Bean 注释的bean工厂方法在XML配置文件中声明bean定义一般现在开发中SpringBoot主要使用注解方法SpringMVC则主要使用xml文件方法。
以下是SpringBoot常用的定义Bean的案例
1在配置文件中使用Bean注解创建Bean
Configuration
public class RedissonConfig {Beanpublic RedissonClient getRedisson(){Config config new Config();//单机模式 依次设置redis地址和密码config.useSingleServer().setAddress(redis://127.0.0.1:6379);return Redisson.create(config);}
}
2业务类Bean主要是Service注解标记为业务相关的Bean具体业务代码请忽略
Service
public class PictureService {public boolean test(){return true;}
}
2.Bean的生命周期
在传统的java 应用中bean 的生命周期很简单。使用Java关键字new 进行实例化然后bean 就可以使用了一旦该bean 不再被使用则由Java自动进行垃圾回收。
而在Spring中主要遵循 实例化——属性赋值——初始化——使用期——销毁 这五大步骤 详细步骤如上图所示。 Spring 根据BeanFactory和反射对bean 进行实例化。 Spring populateBean方法将值和bean的引用注入到bean对应的属性中。 调用invokeAwareMethod方法检查Aware相关接口如果bean实现了BeanNameAware接口Spring将bean的ID传递给setBean-Name() 方法如果bean 实现了BeanFactoryAware接口Spring将调用setBeanFactory() 方法将BeanFactory容器实例传入如果bean实现了ApplicationContextAware接口Spring将调用setApplicationContext() 方法将bean所在的应用上下文的引用传入进来。进行前置处理。如果bean实现了InitializingBean接口Spring将调用它们的after-PropertiesSet()方法。如果bean自定义了init-method调用该方法。进行后置处理。此时, bean 已经准备就绪可以被应用程序使用了它们将一直驻留在应用上下文中直到该应用上下文被销毁。如果bean实现了DisposableBean接口Spring将调用它的destory()接口方法。同样,如果bean使用destroy-method声明了销毁方法该方法也会被调用。
3.BeanFactory及Factory Bean
BeanFactory创建对象时必须严格遵循Bean的生命周期较为复杂。
若需要简单的自定义创建对象且将对象交给Spring处理那么可以实现FactoryBean接口实现。
其主要和以下三个参数相关
IsSingeton:是否单例GetObjectType:获取返回类型GetObject自定义创建对象过程new、反射、动态代理
4.Bean的作用域
1singleton:单例IoC每次返回的都是同一个Bean对象
2prototypeIoC每次返回的都是一个新的Bean实例
3request仅对HTTP请求有用每次HTP请求都会创建一个新的Bean适用于WebApplicationContext环境
4session仅用于HTTP session同一个session共享一个Bean实例
5global-session所有session共享一个Bean实例。
一般我们使用默认的单例模式即可。
5.Bean的线程安全问题
由于Bean的对象默认是单例的即同名的有且只有一个框架中并没有进行多线程的封装处理。所以一般不要在Bean中声明如何有状态的实例或者类变量否则会有数据不一致等相关问题。
如果Bean是有状态的存有有状态的实例或者类变量则需要开发人员自己保证线程安全
把变量编程线程私有ThreadLocal把Bean的作用域从singleton改成prototype在代码上加锁synchronized、lock等。