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
来注解一些解析依赖性接口来实现获取,比如 ApplicationContext
,BeanFactory
等等:
@Autowired
private ApplicationContext context;
1.3.2 @Autowired
注解数组(List
),字典(Map
)
通过添加注解给包含数组的字段或方法,以提供 ApplicationContext 中的所有该数组类型的 Bean,此时如果想要按照一定的顺序进行装配的时候,就可以使用 @Order
注解,如 @Order(1)
表示排列第一个。
在注释到 key
为 String
类型的 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-method
,destroy-method
,name
,其中的 init-method
,destroy-method
都是在返回的 Bean 类中实现。
1.6.1 @ImportResoure
注解
类似在配置文件中使用如下代码一样,如果要使用注释的方式引入 properties
配置文件,就要使用 @ImportResoure
注释,如图: