Spring基础(Bean)
Bean配置项(常用)
- Id
- Class
- Scope
- Constructor arguments
- Properties
- Autowiring mode
- lazy-initialization mode
- Initialization/destruction method
Bean的作用域
- singleton:单例,指一个Bean容器中只存在一份
- prototype: 每次请求(每次使用)创建新的实例,destroy方式不生效
- request:每次http请求创建一个实例且仅在当前request内有效
- session
- global session
- global session
例子(singleton与prototype)
Bean的生命周期
++Bean的定义——Bean的初始化——Bean的使用——Bean的销毁++
- Bean的定义
Bean是spring装配的组件模型,一切实体类都可以配置成一个Bean,进而就可以在任何其他的Bean中使用,一个Bean也可以不是指定的实体类,这就是抽象Bean。 - Bean的初始化
2.1 实现InitializingBean接口,覆盖afterPropertiesSet()方法。
2.2 配置init-method - Bean的使用
3.1 BeanFactory
3.2 ApplicationContext - Bean的销毁
4.1 实现DisposableBean接口,覆盖destory()方法
4.2 配置destroy-method
配置全局默认初始化、销毁方法
default-init-method=“init” default-destroy-method=“destroy”
Aware
- Aware是什么?
- Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源
- 通过Aware接口,可以对Spring相应资源进行操作(一定要慎重)
- 为对Spring进行简单的扩展提供了方便的入口
Bean的自动装配(Autowiring)
default-autowire="byName">
<!-- default-autowire="constructor" -->
<!-- default-autowire="byType" -->
- No:不做任何操作
- Byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
- byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。
- Constructor:与byType方式类似,不同之处在于它应用于构造器参数。
Resources
- 针对于资源文件的统一接口
- Resources
- UrlResource:URL对应的资源,根据一个URL地址即可构建
- ClassPathResource:获取类路径下的资源文件
- FileSystemResource:获取文件系统里面的资源
- ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境下的资源
- InputStreamResource:针对于输入流封装的资源
- 针对于字节数组封装的资源
ResourceLoader
Bean管理的注解
- 元注解
- 许多Spring提供的注解可以作为自己的代码,即“元数据注解”,元注解是一个简单的注解,可以应用到另一个注解
- 除了value(),元注解还可以有其它的属性,允许定制 - 类的自动检测及Bean的注册
- Spring可以自动检测类并注册Bean到ApplicationContext中。 - context:annotation-config/
- 通过在基于XML的Spring配置如下标签(请注意包含上下文命名空间)
- context:annotation-config/仅会查找在同一个applicationContext中的bean注解 - 类的自动检测及Bean的注册
- 为了能够检测这些类并注册相应的Bean,需要下面内容
<context:component-scan base-package="org.example">
- context:component-scan包含context:annotation-config,通常在使用前者后,不用再使用后者
- AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor也会被包含进来 - 使用过滤器进行自定义扫描
- 默认情况下,类被自动发现并注册bean的条件是:使用@Component,@Repository,@Service,@Controller注解或者使用@Component的自定义注解
- 可以通过过滤器修改上面的行为,如:下面例子的XML配置忽略所有的@Repository注解并用“Stub”代替
- 还可使用use-default-filters="false"禁用自动发现与注册
- 定义Bean
- 扫描过程中组件被自动检测,那么Bean名称是由BeanNameGenerator生成的(@Component,@Repository,@Service,@Controller都会有个name属性用于显示设置Bean Name)
- 可自定义bean命名策略,实现BeanNameGenerator接口,并一定要包含一个无参数构造函数。
- 作用域(Scope)
- 通常情况下自动查找的Spring组件,其scope是singleton,Spring2.5提供了一个标识scope的注解@Scope
- 也可以自定义scope策略,实现ScopeMetadataResolver接口并提供一个无参构造器
- 代理方式
- 可以使用scoped-proxy属性指定代理,有三个值可选:no,interfaces,targetClass
- @Required
- @Required注解适用于bean属性的setter方法
- 这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值
- @Autowired
- 可以将@Autowired注解为”传统“的setter方法
- 可用于构造器或成员变量
- 默认情况下,如果因找不到合适的bean将会导致autowiring失败抛出异常,可以通过下面的方式避免
- 每个类只能有一个构造器被标记为required=true
- @Autowired的必要属性,建议使用@Required注解
-可以使用@Autowired注解那些众所周知的解析依赖性接口,比如:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher,and MessageSource
-可以通过添加注解给需要该类型的数组的字段或方法,以提供ApplicationContext中的所有特定类型的bean
-可以用于装配key为String的Map
-如果希望数组有序,可以让bean实现org.springframework.core.Ordered接口或使用的@Order注解
-@Autowired是由Spring BeanPostProcessor处理的,所以不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类型必须通过XML或者Spring的@Bean注解加载
- @Qualifier
- 按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数
- 可用于注解集合类型变量
- @Resource(name="")
- 如果没有显示地指定@Resource的name,默认的名称是从属性名或者setter方法得出
- 注解提供的名字被解析为一个bean的名称,这是由ApplicationContext的中的CommonAnnotationBeanPostProcessor发现并处理的
- 基于java的容器注解
- @Bean标识一个用于配置和初始化一个由SpringIoc容器管理的新对象的方法,类似于XML配置文件的
- 可以在Spring的@Component注解的类中使用@Bean注解任何方法(仅仅是可以)
- 上一点中,通常使用的是@Configuration
@Configuration
public class AppConfig{
@Bean
public MyService myService(){
return new MyServiceImpl();
}
}
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦