Spring笔记(Bean配置及注解形式装配)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38801354/article/details/81271763

Bean 的配置项

常用的 Bean 的配置项有以下几种:

  • id:bean 的唯一标识
  • class:具体实例化的类
  • scope:作用域
    • singleton
    • prototype
    • request:每次 http 请求申请一次
  • contructoer arguments
  • properties
  • Autowiring mode:自动匹配
  • lazy-initialization mode:懒加载
  • init-method/destroy-method:初始化、销毁

bean 的资源获取

Aware

Spring 中提供了一些以 aware 结尾的接口,实现了这些 aware 接口的 bean 在初始化之后,可以获取相应的资源,通过它可以对 Spring 的相应的资源进行操作,为了对 Spring 的简单扩张提供了方便的入口。
常用的 aware 的接口有:ApplicationContextAware 以及 BeanNameAware,前者可以获取 applicationContext 的信息,后者可以获取 Bean 名字。

resource

resource 是 spring 针对资源文件的统一接口,通过使用 ResourceLoader 这个接口可以对 resource 进行加载,在spring 的IOC容器中所有的 ApplicationContext 都实现了 ResourceLoader 这个接口,此时 ApplicationContext 实例可以使用 getResource 方法来获取 Resource

XML装配形式中的Bean自动装配(Autowiring)

XML 配置方法中,在 <Beans> 标签上添加 default-autowire 属性,可以实现 Bean 的自动装配
default-autowire 自动转配属性种类:

  • no:不作任何操作
  • byName:根据属性名称自动装配
  • byType:根据属性,有多个相同类型的bean时,会抛出异常,没有匹配的bean时,则什么事都不会发生
  • Contructor:根据属性,与 byType 相似,不同在于它应用于构造器参数,没有匹配的bean时,会抛出异常

1 Bean装配的注解形式

1.1 组件的自动扫描与注册

从 Spring3.0 开始,SpringConfig 项目提供了很多特性,包括使用 Java 的注解方式而不是 XML文件来定义Bean。
使用注解形式时,为了能够检测这些类并注册相应的Bean,需要使用到下面内容:

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

它可以完成组件的扫描,然后把这些类注册到 IOC 容器中,其中 base-package 表示扫描这个包中所有的类。
默认情况下,类被自动发现并注册到bean中的 条件 是使用@Component@Repository@Service@Controller 或使用 @Component 的自定义注解。

  • @Component:通用的注解,可用于任何Bean,@Repository@Service@Controller 可看作为它的子注解
  • @Repository:通常注解 DAO 类,即持久层
  • @Service: 通常注解 Service 类,即服务层
  • @Controller: 通常注解 Controller 类,即控制层

可以通过过滤器修改上面的行为,进行自定义的扫描。

1.1.1 设置自定义扫描过滤器

自定义扫描过滤器由以下的形式创建

<context:component-scan base-package="" >
    <context:include-filter type="regex" expression=".*Stub.*Repository" />
    <context:exclude-filter type="annotaion" expression="org.springframework.stereotype.Repository" />
</context>

以上 include-filter 表示包含哪些,而 exclude-filter 表示去除哪些,同时 type 的种类有:

  • annotaion:注解类型
  • regex:正则表达式
  • assignable:具体到某个类
  • custom:自定义的
  • aspectj

1.1.2 命名策略

Bean 名称是有 BeanNameGenerator 生成的,想要批量格式化Bean的名称,可以自定义 Bean 的命名策略,在 <context> 标签内,添加 name-generator 属性指定一个实现了 BeanNameGenerator 接口的类,同时这类必须要包含一个无参的构造器。

1.1.3 Bean的作用域

使用 @scope 注解可以提供标识作用域功能,同时也可以自定义scope,此时需要在 <context> 标签内,添加 scope-resolver 属性指定一个实现了 ScopeMetaResolver 接口的类,同时这类必须要含有一个无参的构造器

1.1.4 加载资源文件

<context:propery-placeholder location="classpath:/cn/seiei/jdbc.properties" />

1.2 @Required 注解

Required 注解使用与 Bean 属性setter 方法中,标识该 Bean 属性必须要在配置是被填充

1.3 @Autowired 注解

关于 @Autowired 注解是 byName 还是 byType ,可以参考这篇文章《@Autowired注解到底是byType还是byName?》

@Autowired 注解从字面上理解就是:自动地进行装配,它比 @Required 注解使用要广泛的多,它可以用于 setter 方法,成员变量,构造器
默认情况下,如果找不到合适的 Bean 进行装配,会导致autowired异常,可以通过 @Autowired(required=false) 来避免,每个类只能有一个构造函数配置为 @Autowired(required=true)

1.3.1 @Autowired 注解依赖性接口

同时还可以使用 @Autowired 来注解一些解析依赖性接口来实现获取,比如 ApplicationContextBeanFactory 等等:

@Autowired
private ApplicationContext context;

1.3.2 @Autowired 注解数组(List),字典(Map

通过添加注解给包含数组的字段或方法,以提供 ApplicationContext 中的所有该数组类型的 Bean,此时如果想要按照一定的顺序进行装配的时候,就可以使用 @Order 注解,如 @Order(1) 表示排列第一个。
在注释到 keyString 类型的 Map 中时,该 key 字符串值为装配的 Bean 的名称;

1.4 @Qualifier 注解

@Autowired 注解默认是 byType,当出现多个相同匹配的 Bean 时,除了可以指定变量名字与 Bean 的 ID 相同以外,还可以添加 @Qualifier("id") 注解来区分,在 XML 配置方式中,可以在 <Bean> 标签中添加 <qualifier value="main"> 标签来定义区分

1.5 @Resource 注解

如果通过名字进行注解注入的时候,主要使用的不是 @Autowired@Qulifier 注解结合,而是使用 @Resource 注解,它是通过其独特的名称来定义一个特定的目标。二者的用法区别:

  • @Resource 适用于 成员变量、只有一个参数的 setter 方法
  • @Qualifier 适用于 目标是构造函数或一个多参数的方法时

1.6 @Configuration 注解与 @Bean 注解

使用 @Configuration 注解与 @Bean 注解,个人感觉就是使用 Jave 来模拟配置XML文件。
通过使用 @Configuration 注解某个类,表示这是一个拟配置XML文件,使用 @Bean 注解返回 Bean 类,用来表示XML文件中的 Bean。其中 @Bean 的属性有 init-methoddestroy-methodname,其中的 init-methoddestroy-method 都是在返回的 Bean 类中实现

1.6.1 @ImportResoure 注解

类似在配置文件中使用如下代码一样,如果要使用注释的方式引入 properties 配置文件,就要使用 @ImportResoure 注释,如图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_38801354/article/details/81271763