装配bean
Spring 配置可选方案
在XML中进行显式配置。
在Java中进行显式配置。
隐式的bean发现机制和自动装配
自动化装配Bean
第一步:通过@Component注释定义类为组件类(该类需要创建bean)
第二步:开启组件扫描,设置扫描的基础包
方式一:使用@Configuration定义一个配置类,并使用ComponentScan开启组件扫描
方式二:使用xmL配置方式开启组件扫描和基础包设置
(通过扫描的带有@Component注释的类会被创建为Spring bean)
创建可被发现的bean
@Component: 表明该类会作为组件类,并告知Spring要为这个类创建bean
为bean命名
方式1:Spring所有bean都会有一个id,如果没有明确设置,id为类名第一个字母小写(如HelloWorld类的id名为helloWorld)
方式2:通过@Component(“idName”),主动设置id
方式3:通过java依赖提供的@Named(“idName”),来主动设置,与2只有细微差别
设置组件扫描的基础包
方式1:当没有为@ComponentScan设置属性时,默认基础包为该类所在的包为基础包(base-package)。
方式2:@ComponentScan(“packageName”) 方式指定基础包
方式3:@ComponentScan(basePackages = “packageName”) 方式指定基础包(更加清晰表明)
方式4:@ComponentScan(backPackages = {“packageName1”, ”packageName2”}) 组数方式设置多个基础包
方式5:@ComponentScan(basePackageClasses={DemoClass.class, DemoClass2.class}) 通过类,来设定该类所在的包为基础包
注:因为2、3、4都是String类,是类型不安全的(not type-Safe),所以5更加安全。且可以在所想要的基础包中,添加一个空标记接口,只用于设置基础包。这样对代码重构友好。
组件扫描启用
方式一:@ComponentScan 该注释会主动查找该类所在报下的所有@Conponent注释的类,并为其创建bean
方式二:xml设置,<context:component-scan base-package=”xxx”>,自己设置基础包,扫描基础包下所有组件类。
通过Java代码装配bean
第一步:使用@Configuration定义一个配置类
第二步:编写方法,为该方法加上@Bean注释,方法体内new 一个对象并返回,返回的对象会创建为Spring 的bean
注入方式:通过构造方法或者setter方法,将bean对象传入到方法体内
如何得到bean对象
第一种是调用装配bean的方法,得到bean,在传入到构造方法或setter方法中去
第二种是设置参数,spring会根据参数自动将bean传入到参数中,再由构造该方法或setter注入
创建配置类(javaConfig类)
@Configuration : 定义配置类
配置类(javaConfig类):通过java代码实现spring的配置,摆脱XML
声明简单的bean
@Bean:该注解会告诉Spring这个方法将会返回一个对象,该对象要注册
为Spring应用上下文中的bean。
默认bean的id与方法名一致
@Bean(name = “BeanID) :使用name属性指定bean的id
通过XML装配bean
第一步:在xml中创建<bean id=”” class=””>,Spring会根据xml文件来创建bean
声明一个简单的bean
<bean class=”com.java.masorl.HelloWorld” /> class使用全限定的类名
<bean/>标签没有给定id,则会根据全限定类名来命名。上诉的id将为:
com.java.masorl.HelloWorld#0 (#0是计数形式,用来区别相同类型的其他bean)
如果声明了其他的HelloWorld,自动id就是com.java.masorl.HelloWorld#1
<bean id=”helloworld” class=”com.java.masorl.HelloWorld” /> 也可以通过id属性直接命名id
注入方法:
方法1、通过<constructor-arg>或c-命名空间进行注入(需要借助构造函数)
方法2、通过属性<property> 或p-命名空间进行注入(需要借助setter函数)
装配
通过为bean添加注解实现自动装配
通过上述3中方式,可以产生Bean,现在,将他自动装配到需要的地方。
@Autowired : 实现自动装配,将一个实例注入到类构造器或任意方法中。
如果方法构造器的参数没有匹配到bean,就会报错
@Autowired(required=false): 没有匹配不会报错,spring会使该bean处于为装配状态(使用required=false,需要在代码进行null检查,不然可能会初夏NullPointerException)
如果多个bean同时满足,也会报错
@Inject: java依赖注解,与@Autowired效果相同,只有细微差别
配置类中的自动装配(往Bean中注入bean)
假设A、B两类都是bean类,其中B类依赖于A类,那么需要将A类注入到B中。
方法1:在@Bean注释的方法体中,引用A的方法体,通过B的构造函数,将a的bean对象传入到B中(a()返回的是bean对象)
方法2:b方法请求一个A参数。当Spring调用b方法时,会自动装配一个A到配置方法中
XML中的注入
借助构造器注入bean
<constructor-arg> 元素注入
通过ref=”a”告诉spring将id为a的bean注入到b中
一个<constructor-arg>元素代表构造函数的一个参数,顺序从上到下一次对应第一个到第n个参数
使用Spring 3.0所引入的c-命名空间注入
通过bean中添加c-命名空间属性来注入,例:
属性名组成
关于构造器参数名,比方说B的构造器参数,如下,参数名为ac
那么c-命名空间就是 c:ac-ref = “beanId”;
另一中c-命名空间方式,使用参数在整个构造函数参数列表中的位置
第一个位置的参数,就是 c:_0-ref=”beanid”;(下划线加位置)
注入字符串
<constructor-arg value=”hello world ”> (多个constructor-arg 会按照顺序一个一个赋值)
C:_构造函数参数名 = “hello world ,the best”
C:_0 = “hello world ,the best”
注入集合
C-命名空间无法做到
<constructor-arg>可以做到
List集合注入
Set集合注入(与list相同)
借助setter属性注入bean
通过setter方法,将bean注入到属性中【必须要有setter方法】
p-命名空间方法
注入字符串
注入集合
Util-命名空间
以util:list为例,在bean外部写上<util:list>,这样就可以使用p:命名空间注入集合了