Spring学习2:装配bean

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

 装配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:命名空间注入集合了 

猜你喜欢

转载自blog.csdn.net/MASORL/article/details/82556637