查找两种
Spring容器是采用DI方式实现了IOC控制,IOC是Spring容器的基础和核心
DI概念
DI全称是Dependency Injection,被译为依赖注入
DI的基本原理就是将一起工作具有关系的对象,通过构造方法参数或方法参数传入建立联系,因此容器的工作就是创建bean时注入那些依赖关系
IOC是一种思想,而DI是实现IOC的主要技术途径
DI主要有两种注入方式,即Setter注入和构造器注入
Setterr注入
通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现setter方式的注入
public class JDBCDataSource{
private String driver;
public void setDriver(String driver){
try{
Class.forName(driver);
this.driver = driver;
}catch(Exception e){
throw new RuntimeException(e);
}
}
//其他代码....
}
在容器xml配置中,配置注入参数
<bean id = "dataSource" class = "org.dao.JDBCDataSource">
<property name = "driver" value = "oracle.jdbc.OracleDriver"/>
<property name = "url" value = "jdbc.oracle:thin:@localhost:1521:XE"/>
<property name = "user" value = "openlab"/>
<property name = "pwd" value = "open123"/>
</bean>
构造器注入
基于构造器的注入是通过调用带参数的构造器来实现的,容器在bean被实例化的时候,根据参数类型执行相应的构造器
public class OracleUserDAO implements UserDAO{
private JDBCDataSource dataSource;
public OracleUserDAO(JDBCDataSource dataSource){
this.dataSource = dataSource;
}
//其他代码.....
}
按构造器参数索引指定注入
<bean id = "dataSource" class = "org.dao.JDBCDataSource">
<property name = "driver" value = "oracle.jdbc.OracleDriver"/>
<property name = "url" value = "jdbc:oracle:thin:@localhost:1521:XE"/>
<peoperty name = "user" value = "openlab"/>
<peoperty name = "pwd" value = "open123"/>
</bean>
<bean id = "userDAO" class = "org.dao.OracleUserDAO">
<constructor-arg index = "0" ref = "dataSource"/>
</bean>
自动装配
Spring IOC容器可以自动装配(autowire)相互协作bean之间的关联关系,autowire可以针对单个bean进行设置,autowire的方便之处在于减少xml的注入配置
在xml配置文件中,可以在<bean/>元素中使用autowire属性指定自动装配规则,一共有五种类型值
属性值为no:禁止自动装配,默认值;
属性值为byName:根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配;
属性值为byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;
属性值为constructor:与byType的方式类似,不同之处在于它应用于构造器参数;
属性值为autodetect:通过bean类来决定是使用constructor还是byType方式进行自动装配,如果发现默认的构造器,那么将使用byType方式
配置示例:
<bean id = "userDAO" class = "org.dao.OracleUserDAO">
<constructor-arg index = "0" ref = "dataSource"/>
</bean>
<bean id = "userService" class = "org.service.UserService" autowire = "byType"/>
上述配置,在UserService中如果存在接收UserDao类型的方法Setter方法,Spring就可以自动将userDAO对象注入进去
(自己总结,仅供参考。)