spring IOC bean配置方法

来源:互联网 发布:ubuntu anaconda 编辑:程序博客网 时间:2024/06/16 08:34

spring IOC主要有XML和注解两种方式,XML配置可以基于类名、工厂方法(静态工厂方法和实例工厂方法)、FactoryBean。


一、XML配置

1、基于类名

<!--

class为全类名,

id为spring容器创建的bean对象id,

init-method和destroy-method分别为初始化和销毁时调用的方法,

scope定义bean的作用域,默认为singleton,只创建一次,如果要每次使用的时候都创建,就是用prototype

-->

<bean id="helloWorld" class="com.HelloWorld" 
init-method="init" destroy-method="destory" scope="singleton">
</bean>

1.1 通过属性注入

<bean id="helloWorld" class="com.HelloWorld" 
init-method="init" destroy-method="destory" scope="singleton">

<property name="name" value="spring"></property>

</bean>

<property>元素为bean的属性赋值,name为属性名称,value为值

1.2通过构造函数注入

构造函数如下

public HelloWorld(String name,int a) {
System.out.println("Hello world constructor...");
}


配置文件如下

<bean id="helloWorld" class="com.HelloWorld" 
init-method="init" destroy-method="destory" scope="prototype">
<constructor-arg value="spring"></constructor-arg>
<constructor-arg value="100"></constructor-arg>
</bean>

默认constructor-arg顺序必须与构造函数的参数顺序一致,如果顺序不一致,就要通过index属性来指定,如下

<bean id="helloWorld" class="com.HelloWorld" 
init-method="init" destroy-method="destory" scope="prototype">
<constructor-arg value="100" index="1"></constructor-arg>
<constructor-arg value="spring" index="0"></constructor-arg>
</bean>

如果还有另外一个构造函数,第二个参数是double型的,那个100这个值就都可以匹配上,此时,可以通过type属性来指定,如下:

<bean id="helloWorld" class="com.HelloWorld" 
init-method="init" destroy-method="destory" scope="prototype">
<constructor-arg value="100" index="1" type="int"></constructor-arg>
<constructor-arg value="spring" index="0"></constructor-arg>
</bean>

2、工厂方法

2.1 静态工厂方法

首先创建具有静态方法的工厂类

public class StaticFactory {
public static HelloWorld getHelloWorld(String name) {
return null;
}
}

配置文件如下

<!--

class必须是工厂的全类名

factory-method为工厂的静态方法

constructor-arg提供静态方法所必须的参数

-->

<bean id="helloWorld" class="com.StaticFactory" factory-method="getHelloWorld">
<constructor-arg value="helloWorld"></constructor-arg>
</bean>

2.2 实例工厂方法

首选创建实例工厂类

public class InstanceFactory {
public HelloWorld getHelloWorld(String name) {
return null;
}
}

配置如下

<!-- 首先必须要有实例工厂的bean -->

<bean id="factory" class="com.InstanceFactory"></bean>

<!-- factory-bean: 指定创建该bean的实例工厂
factory-method: 指定工厂方法
constructor-arg: 指定工厂方法的参数
-->
<bean id="helloWorld" factory-bean="factory" factory-method="getHelloWorld">
<constructor-arg value="helloWorld"></constructor-arg>
</bean>

2.3 FactoryBean

首先创建FactoryBean

public class HelloFactoryBean implements FactoryBean<HelloWorld> {


// 返回bean对象
@Override
public HelloWorld getObject() throws Exception {
// TODO Auto-generated method stub
return new HelloWorld("Hello World", 1);
}


@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return HelloWorld.class;
}


@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}


}

配置如下

<!-- 
class指定FactoryBean的全类名
通过getObject方法获得bean
 -->
<bean id="helloWorld" class="com.HelloFactoryBean">
</bean>


二、注解

注解包含以下几类

@Comonent 表示受Spring管理的基本组件

@Respository 表示受Spring管理的持久层组件

@Service 表示受Spring管理的业务层组件

@Controller 表示受Spring管理的表现层组件


通过注解扫描到的组件,默认名称是类名的第一个字母小写,如果要指定名称,就通过value属性指定,如@Component("User"),value为默认属性,可以省略写。

配置文件如下

<!--

base-package 指定扫描的包路径,其子路径会同时被扫描

resource-pattern 可以指定符合某些格式的类被扫描

-->

<context:component-scan base-package="com" resource-pattern="*.class"></context:component-scan>

context:component-scan还可以使用context:exclude-filter子节点来排除某些类,用context:include-filter来只包含某些类。

只包含某些类的写法:

<!-- use-default-filters 这个默认是true,如果要只包含某些类,就将其设置为false -->
<context:component-scan 
base-package="com.generic" use-default-filters="false">
<!-- 
type:使用annotation表示 根据注解来区分
expression:是注解的引用包名称
-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

排除某些类的写法:

<!-- use-default-filters 这个默认是true,如果只排除某些类,将其设置为true,或不填写 -->
<context:component-scan 
base-package="com.generic" use-default-filters="true">
<!-- 
type:使用annotation表示 根据注解来区分
expression:是注解的引用包名称
-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>


1 0