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>