为了账号安全,请及时绑定邮箱和手机立即绑定

Spring基础(Bean)

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的销毁++

  1. Bean的定义

    Bean是spring装配的组件模型,一切实体类都可以配置成一个Bean,进而就可以在任何其他的Bean中使用,一个Bean也可以不是指定的实体类,这就是抽象Bean。
  2. Bean的初始化

    2.1 实现InitializingBean接口,覆盖afterPropertiesSet()方法。

    2.2 配置init-method
  3. Bean的使用

    3.1 BeanFactory

    3.2 ApplicationContext
  4. Bean的销毁

    4.1 实现DisposableBean接口,覆盖destory()方法

    4.2 配置destroy-method

配置全局默认初始化、销毁方法

default-init-method=“init” default-destroy-method=“destroy”

Aware

  1. 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管理的注解

  1. 元注解

     - 许多Spring提供的注解可以作为自己的代码,即“元数据注解”,元注解是一个简单的注解,可以应用到另一个注解

     - 除了value(),元注解还可以有其它的属性,允许定制
  2. 类的自动检测及Bean的注册

     - Spring可以自动检测类并注册Bean到ApplicationContext中。
  3. context:annotation-config/

     - 通过在基于XML的Spring配置如下标签(请注意包含上下文命名空间)

     - context:annotation-config/仅会查找在同一个applicationContext中的bean注解
  4. 类的自动检测及Bean的注册

     - 为了能够检测这些类并注册相应的Bean,需要下面内容

    <context:component-scan base-package="org.example">

     - context:component-scan包含context:annotation-config,通常在使用前者后,不用再使用后者

     - AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor也会被包含进来
  5. 使用过滤器进行自定义扫描
  • 默认情况下,类被自动发现并注册bean的条件是:使用@Component,@Repository,@Service,@Controller注解或者使用@Component的自定义注解
  • 可以通过过滤器修改上面的行为,如:下面例子的XML配置忽略所有的@Repository注解并用“Stub”代替
  • 还可使用use-default-filters="false"禁用自动发现与注册
  1. 定义Bean
  • 扫描过程中组件被自动检测,那么Bean名称是由BeanNameGenerator生成的(@Component,@Repository,@Service,@Controller都会有个name属性用于显示设置Bean Name)
  • 可自定义bean命名策略,实现BeanNameGenerator接口,并一定要包含一个无参数构造函数。
  1. 作用域(Scope)
  • 通常情况下自动查找的Spring组件,其scope是singleton,Spring2.5提供了一个标识scope的注解@Scope
  • 也可以自定义scope策略,实现ScopeMetadataResolver接口并提供一个无参构造器
  1. 代理方式
  • 可以使用scoped-proxy属性指定代理,有三个值可选:no,interfaces,targetClass
  1. @Required
  • @Required注解适用于bean属性的setter方法
  • 这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值
  1. @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注解加载
  1. @Qualifier
  • 按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数
  • 可用于注解集合类型变量
  1. @Resource(name="")
  • 如果没有显示地指定@Resource的name,默认的名称是从属性名或者setter方法得出
  • 注解提供的名字被解析为一个bean的名称,这是由ApplicationContext的中的CommonAnnotationBeanPostProcessor发现并处理的
  1. 基于java的容器注解
  • @Bean标识一个用于配置和初始化一个由SpringIoc容器管理的新对象的方法,类似于XML配置文件的
  • 可以在Spring的@Component注解的类中使用@Bean注解任何方法(仅仅是可以)
  • 上一点中,通常使用的是@Configuration
@Configuration
public class AppConfig{
    
    @Bean
    public MyService myService(){
        return new MyServiceImpl();
    }
}
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消