使用 <context:component-scan>
特性,可以自动扫描 base-package
下类名有注解 @Component
、@Service
或者 @Controller
的类,为其在 Spring 容易里创建一个对象。
@Service
、@Controller
和 @Component
在语法上作用是一样的,区别是各自有自己的语义,例如 SpringMVC 里用 @Controller
表明类是 Controller
。
大圣,此去欲何?踏南天,碎凌霄。若一去不回…… 便一去不回!
使用 <context:component-scan>
特性,可以自动扫描 base-package
下类名有注解 @Component
、@Service
或者 @Controller
的类,为其在 Spring 容易里创建一个对象。
@Service
、@Controller
和 @Component
在语法上作用是一样的,区别是各自有自己的语义,例如 SpringMVC 里用 @Controller
表明类是 Controller
。
在 properties
文件里定义 key | value,然后在 Bean Configuration File 里用 ${key}
引用 key 对应的值。
Bean Configuration File 里使用 <context:property-placeholder>
引入 properties 文件。
现在很多时候都使用 Gradle 的资源替换来代替了。
把 Spring 的 Bean Configuration File 根据模块分散到不同的文件里,便于管理,然后使用 <import>
把它们组织在一起。例如:
Bean | Bean Configuration File |
---|---|
user | spring-beans.xml |
address | spring-beans-1.xml |
customer | spring-beans-2.xml |
在 spring-beans.xml 里 import spring-beans-1.xml and spring-beans-2.xml,然后 Spring Context 加载 spring-beans.xml。
Bean 在配置文件中定义的顺序任意,其实最后就是把所有的配置文件和成一个大的配置文件,然后在解析创建对象,所以就像在单一的配置文件里定义 Bean 一样顺序不重要。
在设置一个对象类型的属性时:
ref
引用已经存在的对象bean
标签创建一个匿名对象value
赋值一个字符串,Spring 自动的把这个字符串转换为对象第三种方式的实现需要以下几步:
FactoryBean 是用来创建 Bean 的工厂,实现 FactoryBean 接口
的类就可以用来创建其他 Bean 了,在 Bean Configuration File 里的 <bean>
里定义要生成的 Bean。
FactoryBean 命名规范:Bean 的类名
后跟着 FactoryBean
,例如创建 User 的 FactoryBean 的类名应该为 UserFactoryBean。
如果 Bean 的创建不只是简单的 setter, constructor 注入,而是有其他的逻辑,这个时候就可以用 FactoryBean 来创建 Bean(有点像同时用了 Factory Pattern 和 Builder Pattern)。
FactoryBean 是很常见的,例如 Spring 集成 MyBatis 时用 SqlSessionFactoryBean 来创建 SqlSession。
1 | <bean id="mapExample" class="com.xtuer.beans.CollectionHolder"> |
上面的方式注入 Map,Map 的类型不受我们控制,默认是 java.util.LinkedHashMap。MapFactoryBean 可以创建一个特定类型的 Map。由于 MapFactoryBean 的配置太过麻烦,这里我们只结束和其等效的 <util:map>
。
1 | <bean id="setExample" class="com.xtuer.beans.CollectionHolder"> |
上面的方式注入 Set,Set 的类型不受我们控制,默认是 java.util.LinkedHashSet。SetFactoryBean 可以创建一个特定类型的 Set。由于 SetFactoryBean 的配置太过麻烦,这里我们只结束和其等效的 <util:set>
。
1 | <bean id="listExample" class="com.xtuer.beans.CollectionHolder"> |
上面的方式注入 List,List 的类型不受我们控制,默认是 java.util.ArrayList。ListFactoryBean 可以创建一个特定类型的 List。由于 ListFactoryBean 的配置太过麻烦,这里我们只介绍和其等效的 <util:list>
。
1 | <bean id="listExample" class="com.xtuer.beans.CollectionHolder"> |
<list>
里不只是可以使用 <value>
,还可以使用 <ref bean="">
,<bean class="ClassName">
,如下
1 | <bean id="listExample" class="com.xtuer.beans.CollectionHolder"> |
演示怎么给构造函数注入参数,使用指定的构造函数创建对象。
1 | package com.xtuer.beans; |