一、Spring IOC注入分类
1、手动注入
- set方法
- 构造器
- 扩展方式注入
- 静态工厂
- 实例化工厂
2、自动注入
- @Resource注解
- @AutoWired注解
二、Spring IOC注入详解
1、手动注入
Spring IOC手动注入分为四类,其中第1种set方法注入和第2种构造器注入的方法在我们的日常编程中比较常用.大家可以重点关注一下.
本次通过service层调用dao层的方法来展示
UserDao.class
public class UserDao {
public void test(){
System.out.println("dao....");
}
}
- set方法
public class UserService {
// 业务对象UserDao set注入(提供set方法)
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void test(){
userDao.test();
}
}
.xml
<bean id="userDao" class="com.shsxt.dao.UserDao"/>
<bean id="userService" class="com.shsxt.service.UserService">
<!--业务对象 注入-->
<property name="userDao" ref="userDao"/>
<bean>
- 构造器
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao02) {
this.userDao = userDao;
}
}
.xml
<bean id="userDao" class="com.shsxt.dao.UserDao"/>
<bean id="userService" class="com.shsxt.service.UserService">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
<bean>
扩展方式注入
我们可以使用p命名空间和c命名空间进行注入
p命名空间无参构造函数、c命名空间有参构造函数
public class UserService {
private UserDao userDao;
public UserService() {}
public UserService(UserDao userDao02) {
this.userDao = userDao;
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="p-userService" class="com.shsxt.service.UserService"
p:userDao="userDao"/>
<bean name="p-userService" class="com.shsxt.service.UserService"
c:userDao="userDao"/>
</beans>
- 静态工厂
定义工厂类
public class StaticFactory {
// 定义静态方法
public static TeacherService createTeacherService() {
return new TeacherService();
}
}
.xml
<!--静态工厂注入-->
<bean id="teacherService" class="com.shsxt.factory.StaticFactory" factory-method="createTeacherService"></bean>
- 实例化工厂
定义工厂类
public class InstanceFactory {
public TeacherService createService() {
return new TeacherService();
}
}
.xml
<!--实例化工厂注入-->
<bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean>
<bean id="teacherService" factory-bean="instanceFactory" factory-method="createService"></bean>
2、自动注入
准备工作 配置环境xx.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启自动化装配(注入)-->
<context:annotation-config/>
@Resource注解
private UserDao ud;
@Resource
public void setUd(UserDao ud) {
this.ud = ud;
}
1、默认根据属性字段名称查找对应的bean对象 (属性字段的名称与bean标签的id属性值相等)
2、如果属性字段名称未找到,则会通过类型(Class类型)查找
3、属性可以提供set方法,也可以不提供set方法
4、注解可以声明在属性级别 或 set方法级别
5、@Resource可以设置name属性,name属性值必须与bean的id属性值一致;如果设置了name属性值,就只会按照name属性值查找bean对象
6、当注入接口时,如果接口只有一个实现则正常实例化;如果接口存在多个实现,则需要使用name属性指定需要被实例化的bean对象
@Autowired注解
@Autowired
@Qualifier(value = "accountDao")
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
1、默认通过类型(Class类型)查找bean对象 与属性字段的名称无关
2、属性可以提供set方法,也可以不提供set方法
3、注解可以声明在属性级别 或 set方法级别
4、可以添加@Qualifier结合使用,通过value属性值查找beam对象(value属性值必须要设置,且值要与bwan标签的id属性值对应)
版权声明:本文为peipei696原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。